- 이번 섹션에서 만들어 볼 샘플 프로젝트
- 커피 주문 웹 애플리케이션
- 커피 자체에 대한 정보 (Coffee)
- 주문하려는 고객의 정보 (Member)
- 고객이 주문하려는 커피의 주문정보 (Order)
spring-webmvc
웹 프레임 워크의 한 종류
- 서블릿(Servlet) ?
클라이언트의 요청을 처리하도록 특정 규약에 맞추어서 Java 코드로 작성하는 클래스 파일- 아파치 톰캣 (Apache Tomcat)
서블릿들이 웹 애플리케이션으로 실행이 되도록 해주는 서블릿 컨테이너 중 하나
서비스 계층 : 클라이언트의 요청 사항을 구체적으로 처리하는 영역
비즈니스 로직 : 실제로 요청사항을 처리하기 위해 Java코드로 구현한 것
- HTML 페이지의 출력
- PDF, Excel 등의 문서 형태로 출력
- XML, JSON 등 특정 형식의 포맷으로의 변환 (현재 학습 부분)
- JSON (JavaScript Object Notation)
클라이언트 애플리케이션과 서버 애플리케이션이 주고 받는 데이터 형식
- JSON의 기본 포맷
{"속성":"값"}
형태public class JsonExample { public static void main(String[] args) { Coffee coffee = new Coffee("아메리카노", "Americano", 3000); Gson gson = new Gson(); String jsonString = gson.toJson(coffee); System.out.println(jsonString); } } ====================실행결과 {"korName":"아메리카노","engName":"Americano","price":3000}
@RestController @RequestMapping(path = "/v1/coffee") public class CoffeeController { private final CoffeeService coffeeService; CoffeeController(CoffeeService coffeeService) { this.coffeeService = coffeeService; } @GetMapping("/{coffee-id}") // (1) public Coffee getCoffee(@PathVariable("coffee-id") long coffeeId) { return coffeeService.findCoffee(coffeeId); // (2) } }
- (1)의
@GetMapping
애노테이션을 통해 클라이언트 측의 요청 수신- (2)에서
CoffeeService
클래스의findCoffee()
메서드를 호출해서 비즈니스 로직 처리
비즈니스 로직을 처리한 다음 리턴 받는 Coffee가 Model 데이터Client가 요청 데이터 전송 > 컨트롤러가 요청 데이터 수신 > 비즈니스 로직 처리 > 모델 데이터 생성 > 컨트롤러가 모델 데이터 전달 > 컨트롤러가 뷰에게 모델 데이터 전달 > 뷰가 응답 데이터 생성
Front Controller Pattern
이라고 한다.
- 기능 기반 패키지 구조(package-by-feature) (현재 학습)
나눠진 패키지에 하나의 기능을 완성하기 위한 계층별 클래스들이 모여있음- 계층 기반 패키지 구조(package-by-layer)
패키지를 하나의 계층으로 보고 클래스들을 계층별로 묶어서 관리하는 구조
엔트리포인트 클래스 작성
- (1)
@SpringBootApplication
- 자동 구성 활성화
- 패키지 내에서
@Component
가 붙은 클래스를 검색(scan) 후, Spring Bean으로 등록하는 기능 활성화@Configuration
이 붙은 클래스 자동 찾고, 추가적으로 Spring Bean을 등록하는 기능- (2)
SpringApplication.run(Section3Week1Application.class, args);
- Spring 애플리케이션을 부트스트랩하고, 실행하는 역할
- 부트스트랩 : 앱이 실행되기 전 여러가지 설정 작업 수행, 실행 가능한 앱으로 만듬
커피 주문 애플리케이션의 Controller 구조 작성
- 회원 관리를 위한 MemberController 클래스
- (1)
@RestController
- 해당 클래스가 REST API의 리소스(자원)을 처리하기 위한 API 엔드포인트로 동작함을 정의
- 이 애너테이션이 추가된 클래스는 애플리케이션 로딩 시, Spring Bean으로 등록해줌.
- (2)
@RequestMapping
- 클라이언트의 요청과 클라이언트 요청을 처리하는 핸들러 메서드를 매핑해주는 역할
- Controller 클래스 레벨에 추가하여 클래스 전체에 사용되는 공통 URL 설정을 한다.
- 마찬가지로 CoffeeController와 OrderController 구조 작성
- MemberController의 핸들러 메서드 작성
✔ 요청에 필요한 회원(Memer) 정보
- 회원 이메일 주소 : email
- 회원 이름 : name
- 회원 전화번호 : phoneNumber
- 클래스 레벨의
@RequestMapping
에 추가된produces
- produces애트리뷰트는 응답 데이터를 어떤 미디어 타입으로 클라이언트에 전송할 지 설정
JSON 형식을 응답 데이터로 전송하겠다는 의미MediaType.APPLICATION_JSON_VALUE
postMember()
메서드는 회원 정보를 등록해주는 핸들러 메서드
@PostMapping
은 클라이언트의 요청 데이터를 서버에 생성할 때 사용
클라이언트 쪽에서 요청 전송 시, HTTP 메서드 타입을 동일하게 맞추어야함 (POST)@RequestParam
은 핸들러 메서드의 파라미터 종류 중 하나
주로 클라이언트 쪽에서 전송하는 요청 데이터를 쿼리파라미터, 폼데이터 형식으로 전송하면 이를 서버쪽에서 전달 받을 때 사용하는 애너테이션리턴 값
: postMember() 의 리턴 타입은 현재 String
단, JSON 형식의 데이터를 전송 받아야 하기 때문에 응답 문자열을 JSON 형식에 맞게 작성
getMember()
메서드는 특정 회원의 정보를 클라이언트 쪽에 제공하는 핸들러 메서드@GetMapping
은 클라이언트가 서버에 리소스를 조회할 때 사용하는 애너테이션
- 클라이언트 쪽에서 getMember() 핸들러 메서드에 요청을 보낼 경우, 최종 URI 형태
"/v1/members/{member-id}"@PathVariale
핸들러 메서드의 파라미터 종류 중 하나
- 괄호 안 문자열 값은 `@GetMapping("/{member-id}") 처럼 동일해야 함
getMembers()
메서드는 회원 목록을 클라이언트에게 제공하는 핸들러 메서드
- OrderController의 핸들러 메서드 작성
✔ 요청에 필요한 주문 정보
- 회원 식별자 : memberId
- 커피 식별자 : coffeeId
postOrder()
메서드는 회원 고객이 주문한 커피 주문 정보를 등록해주는 핸들러 메서드
어떤 고객(회원식별자memberId
이 어떤 커피(커피식별자coffeeId)
를 주문했는지- 식별자 : 데이터 베이스의 기본키에 해당
- 심화 학습 CoffeeController 핸들러 메서드 직접 작성
✔ 요청에 필요한 커피 정보
- 커피명(영문) : engName
- 커피명(한글) : korName
- 가격 : price
✔ 작성할 핸들러 메서드
postCoffee() : 커피 정보를 등록하는 핸들러 메서드
getCoffee(): 특정 커피 정보를 제공하는 핸들러 메서드
* getCoffees() : 커피 목록을 제공하는 핸들러 메서드
- 응답으로 전송하는 JSON 형식의 문자열을 수작업으로 작성하는 부분
- 클래스 레벨의 produces 애트리뷰트 삭제
- JSON 문자열을 수작업으로 작성하던 부분이 Map 객체로 대체 (JSON 형식으로 자동 변환)
- 리턴 값으로 JSON 문자열을 리턴하던 부분이 ResponseEntity 객체를 리턴하는 것 변환
생성자 파라미ㅓ로 응답 데이터(map)와 HTTP 응답 상태를 함께 전달
(https://developer.mozilla.org/ko/docs/Web/HTTP/Status - 응답 상태 종류)