티스토리 뷰
이번 주차의 핵심
요청에 따라 눈에 보이는 것 또는 데이터를 제공해주는 스프링 서버 만들어보기
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());
}
};
}
- Course 객체의 course1 인스턴스 생성 후 저장.
- repository.findAll();로 받아온 정보를 List로 받아온다.
- 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 |