티스토리 뷰

이번 주차의 핵심

요청에 따라 눈에 보이는 것 또는 데이터를 제공해주는 스프링 서버 만들어보기

 

API란?

은행 창구와 같은 하나의 약속이다. 정해진대로 요구를 하면 정해진 결과물을 돌려주는 창구

https://www.naver.com/  -> naver.com 이라는 이름의 서버에 있는 "/" 창구에 요청을 보낸 것

클라이언트가 정한대로 서버에게 요청(Request)을 보내면 서버가 요구사항을 처리하여 응답(Response)를 반환

 

정적 변수 & 정적메소드(Static method란?)

static 키워드는 프로그래밍시 공유의 목적으로 사용한다.

정적 메소드는 인스턴스를 선언할 필요 없이 클래스를 이용하여 호출한다.

 

public class Prac {
    public static void printInfo() {
        String title = "웹개발의 봄 Spring";
        String tutor = "남병관";
        int weeks = 5;
        float ratings = 5.0f;

        System.out.println("제목: " + title);
        System.out.println("튜터: " + tutor);
        System.out.println("주차: " + weeks);
        System.out.println("별점: " + ratings);
    }

    public static void main(String[] args) {
        printInfo();
        printInfo();
        printInfo();
    }
}

Prac 클래스안의 printInfo 클래스의 static을 빼면, main 메소드에서 작동하지 않는다.

public class Prac {
    public void printInfo() {
        String title = "웹개발의 봄 Spring";
        String tutor = "남병관";
        int weeks = 5;
        float ratings = 5.0f;

        System.out.println("제목: " + title);
        System.out.println("튜터: " + tutor);
        System.out.println("주차: " + weeks);
        System.out.println("별점: " + ratings);
    }

    public static void main(String[] args) {
        Prac prac1 = new Prac();
        prac1.printInfo();
    }
}

static을 빼면 이렇게 선언해야한다.

 

클래스

모든 클래스는 변수로 선언이 가능하다. 클래스 = 틀

클래스 내의 메소드는 public으로 선언

 

생성자

생성자는 return 값이 없다.

파라미터가 존재하지 않는 생성자를 기본 생성자라고 한다.

 

Getter / Setter

필드의 접근제어자는 private로 설정한다

public class Course {
    private String title;
    private String tutor;
    private int days;

    //Setter
    public void setTitle(String title){
        this.title = title;
    }
    public void setTutor(String tutor){
        this.tutor = tutor;
    }
    public void setDays(int days){
        this.days = days;
    }

    //Getter
    public String getTitle() {
        return this.title;
    }
    public String getTutor() {
        return this.tutor;
    }
    public int getDays() {
        return this.days;
    }
}

RestController란?

  • Rest: 서버의 응답이 JSON 형식(데이터)임을 나타낸다. HTML, CSS를 주고 받을 때는 Rest를 붙이지 않는다
  • Controller: 클라이언트의 요청(Request)를 전달받는 코드. 말을 걸면 응답하는 자동응답기 같은 것.
  • RestController: JSON 데이터 타입만을 돌려주는 Controller를 말한다.
@RestController
public class CourseController {
    @GetMapping("/courses")
    public Course getCourses() {
        Course course = new Course();
        course.setTitle("웹개발의 봄 스프링");
        course.setDays(35);
        course.setTutor("남병관");
        return course;
    }
}

controller 패키지안 CourseController라는 클래스를 생성한 후, JSON형식의 데이터를 돌려주는 RestController를 생성한다. "/course" API 창구에 Course라는 인스턴스의 값을 대입해 돌려주면 localhost:8080/course에는 JSON 타입으로 변환된 course들의 값이 뜬다.

 

GET요청

클라이언트가 브라우저에 주소를 쳐서 정보를 요청하는 행위를 GET 요청이라 한다.

 

Gradle

라이브러리를 가져올 때 사용하는 툴 / 빌드해서 배포하는 툴

 

JPA

자바 언어를 SQL로 번역해주는 번역기 같은 것. 기본적인 기능이 거의 완벽하게 들어가있음. Repository는 JPA의 작동을 도와주는 매개체.

SQL을 쓰지 않고 데이터 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기

  • Table을 JPA에서는 Domain으로
  • SQL을 JPA에서는 Repository

이용한다.

CREATE TABLE IF NOT EXISTS courses (
    id bigint(5) NOT NULL AUTO_INCREMENT, 
    title varchar(255) NOT NULL,
    tutor varchar(255) NOT NULL,
    PRIMARY KEY (id)
);
  • bigint: long type이라고 생각하면 됨
  • AUTO_INCREMENT: 자동적으로 1씩 증가하게 만든다.

JPA로 course Domain 생성하기

com.example.week02.domain Course class

package com.example.week02.domain;

import lombok.NoArgsConstructor;
import javax.persistence.*;

@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.
@Entity // 테이블임을 나타냅니다.
public class Course {

    @Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
    @GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
    private Long id;

    @Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
    private String title;

    @Column(nullable = false)
    private String tutor;

    public String getTitle() {
        return this.title;
    }

    public String getTutor() {
        return this.tutor;
    }

    public Course(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }
}

Course 객체의 틀을 만들어 줌.

 

com.example.week02.domain CourseRepository Interface

public interface CourseRepository extends JpaRepository<Course, Long> {
}

CourseRepository는 sql을 대신 데이터 생성, 조회, 수정, 삭제를 해주는 번역기.  상속(extends)을 통해 JpaRepository기능을 사용한다.
JpaRepository에게 넘겨준 매개변수의 의미는 <Course 클래스, 기본키(id)의 타입이 long>

 

@Bean
	public CommandLineRunner demo(CourseRepository repository) {
		return (args) -> {
			Course course1 = new Course("웹개발의 봄: Spring", "김민지");
			repository.save(course1);

			List<Course> courseList = repository.findAll();
			for(int i = 0; i < courseList.size(); i++){
				Course c = courseList.get(i);
				System.out.println(c.getTitle());
				System.out.println(c.getTutor());
			}
		};
	}
  1. Course 객체의 course1 인스턴스 생성 후 저장.
  2. repository.findAll();로 받아온 정보를 List로 받아온다.
  3. courselist의 값은 주소로 저장되어 있으므로 정보를 출력하기 위해 Course 멤버 메소드 getTitle과 getTutor 출력

com.example.week02.service CourseService Class

@Service // 스프링에게 이 클래스는 서비스임을 명시
public class CourseService {

    // final: 서비스에게 꼭 필요한 녀석임을 명시
    private final CourseRepository courseRepository; //클래스에서 무조건 필요하다

    // 생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록
    // 스프링에게 알려줌
    public CourseService(CourseRepository courseRepository) {
        this.courseRepository = courseRepository;
    }

    @Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌, 자동으로 sql에 저장
    public Long update(Long id, Course course) { //매개변수는 update를 수행할 id와 변결될 domain을 넣어줌
        Course course1 = courseRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
        );
        course1.update(course); //Course 객체의 멤버 메소드인 update를 사용해서 데이터 변경
        return course1.getId();
    }
}

public CourseService(CourseRepository courseRepository) {
        this.courseRepository = courseRepository;
    }

부분을 Lombok의 @RequiredArgsConstructor 어노테이션을 선언해줌으로써 생략 가능

 

DTO

관련 정보를 몰고 다닐 녀석

Course new_course = new Course("웹개발의 봄, Spring", "임민영");
            courseService.update(1L, new_course);
            courseList = courseRepository.findAll();
            for (int i = 0; i < courseList.size(); i++) {
                Course course = courseList.get(i);
                System.out.println(course.getId());
                System.out.println(course.getTitle());
                System.out.println(course.getTutor());
            }

 

 

REST의 구체적인 개념

  • HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.
  • 즉, REST는 자원 기반의 구조(ROA, Resource Oriented Architecture) 설계의 중심에 Resource가 있고 HTTP Method를 통해 Resource를 처리하도록 설계된 아키텍쳐를 의미한다.
  • 웹 사이트의 이미지, 텍스트, DB 내용 등의 모든 자원에 고유한 ID인 HTTP URI를 부여한다.
  • CRUD Operation

Create : 생성(POST)
Read : 조회(GET)
Update : 수정(PUT)
Delete : 삭제(DELETE)
HEAD: header 정보 조회(HEAD)'

REST API란


REST 기반으로 서비스 API를 구현한 것
최근 OpenAPI(누구나 사용할 수 있도록 공개된 API: 구글 맵, 공공 데이터 등), 마이크로 서비스(하나의 큰 애플리케이션을 여러 개의 작은 애플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍처) 등을 제공하는 업체 대부분은 REST API를 제공한다.

출처: https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html   

 

com.example.week02.controller CourseController Class

@PostMapping("/api/courses")
    public Course createCourse(@RequestBody CourseRequestDto requestDto) {
        Course course = new Course(requestDto);
        // JPA를 이용하여 DB에 저장하고, 그 결과를 반환합니다.
        return courseRepository.save(course);
    }

    @GetMapping("/api/courses")
    public List<Course> getCourses() {
        return courseRepository.findAll();
    }

@RequestBody라는 Anotation을 생성하면서 넘어오는 데이터를 requestDto 안에 넣음. @RequestBody를 붙여주지 않으면 요청 정보가 들어가지 않는다.(요청을 주고 받는 방식을 강제)           

@PutMapping("/api/courses/{id}") //변형된 값이 들어올 걸 알려줌
    public Long updateCourse(@PathVariable Long id, @RequestBody CourseRequestDto requestDto) {
        return courseService.update(id, requestDto);
    }

updateCourse의 id 매개변수에 @PathVariable을 붙여줌으로써 {id} 값에  Long id가 들어갈 것을 명시해줌.

'항해99(7기) > 항해 3주차' 카테고리의 다른 글

항해99(7D) 3주 마지막날  (0) 2022.05.27
항해99(7D) 3주 3일차  (0) 2022.05.23
항해 99(7D) 3주 2일차  (0) 2022.05.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함