SEB_BE 41일차 - 웹 계층 (Controller)

subimm_·2022년 10월 20일
0

코드스테이츠

목록 보기
41/83

💡 오늘의 학습목표

  • Spring MVC
  • Controller
  • 심화 (HTTP헤더, Rest Client)
  • 이번 섹션에서 만들어 볼 샘플 프로젝트
    • 커피 주문 웹 애플리케이션
      • 커피 자체에 대한 정보 (Coffee)
      • 주문하려는 고객의 정보 (Member)
      • 고객이 주문하려는 커피의 주문정보 (Order)

📔 Spring MVC

  • Spring 모듈 중 웹 계층을 담당하는 서블릿API를 기반으로 클라이언트의 요청을 처리하는 모듈
    spring-webmvc 웹 프레임 워크의 한 종류
    • 서블릿(Servlet) ?
      클라이언트의 요청을 처리하도록 특정 규약에 맞추어서 Java 코드로 작성하는 클래스 파일
    • 아파치 톰캣 (Apache Tomcat)
      서블릿들이 웹 애플리케이션으로 실행이 되도록 해주는 서블릿 컨테이너 중 하나

📖 MVC (Model)

  • 클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터를 Model이라고 한다.

    서비스 계층 : 클라이언트의 요청 사항을 구체적으로 처리하는 영역
    비즈니스 로직 : 실제로 요청사항을 처리하기 위해 Java코드로 구현한 것

📖 MVC (View)

  • Model 데이터를 이용해서 웹브라우저 같은 클라이언트 애플리케이션 화면에 보여지는 리소스를 제공하는 역할
  • 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}

https://jsonformatter.org/json-to-java

📖 MVC (Controller)

  • 클라이언트 측의 요청을 직접적으로 전달 받는 엔드포인트로써 Model과 View의 중간에서 상호 작용을 해주는 역할
    • 클라이언트 측의 요청을 전달 받아서 비즈니스 로직을 거친 후에 Model데이터가 만들어지면, 이 데이터를 View로 전달하는 역할
@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가 요청 데이터 전송 > 컨트롤러가 요청 데이터 수신 > 비즈니스 로직 처리 > 모델 데이터 생성 > 컨트롤러가 모델 데이터 전달 > 컨트롤러가 뷰에게 모델 데이터 전달 > 뷰가 응답 데이터 생성

📔 Spring MVC의 동작방식과 구성 요소

  • DispatchServle이 애플리케이션의 가장 앞단에 배치되어 다른 구성요소들과 상호작용하면서 클라이언트의 요청을 처리하는 패턴을 Front Controller Pattern 이라고 한다.

📙 Controller

📖 Controller 클래스 설계 및 구조 생성

  • API계층 : 클라이언트의 요청을 직접적으로 전달 받는 계층
  1. 애플리케이션 경계 설정과 요구 사항 수집 (커피 주문 애플리케이션)
  2. 패키지 구조 생성
    • 기능 기반 패키지 구조(package-by-feature) (현재 학습)
      나눠진 패키지에 하나의 기능을 완성하기 위한 계층별 클래스들이 모여있음
    • 계층 기반 패키지 구조(package-by-layer)
      패키지를 하나의 계층으로 보고 클래스들을 계층별로 묶어서 관리하는 구조
  3. 커피 주문 애플리케이션의 Controller 설계
  • 리소스 : 회원(Memer), 커피(Coffee), 주문(Order)
  1. 엔트리포인트 클래스 작성

    • (1) @SpringBootApplication
      • 자동 구성 활성화
      • 패키지 내에서 @Component가 붙은 클래스를 검색(scan) 후, Spring Bean으로 등록하는 기능 활성화
      • @Configuration이 붙은 클래스 자동 찾고, 추가적으로 Spring Bean을 등록하는 기능
    • (2) SpringApplication.run(Section3Week1Application.class, args);
      • Spring 애플리케이션을 부트스트랩하고, 실행하는 역할
        • 부트스트랩 : 앱이 실행되기 전 여러가지 설정 작업 수행, 실행 가능한 앱으로 만듬
  2. 커피 주문 애플리케이션의 Controller 구조 작성

    • 회원 관리를 위한 MemberController 클래스
    • (1) @RestController
      • 해당 클래스가 REST API의 리소스(자원)을 처리하기 위한 API 엔드포인트로 동작함을 정의
      • 이 애너테이션이 추가된 클래스는 애플리케이션 로딩 시, Spring Bean으로 등록해줌.
    • (2) @RequestMapping
      • 클라이언트의 요청과 클라이언트 요청을 처리하는 핸들러 메서드를 매핑해주는 역할
        • Controller 클래스 레벨에 추가하여 클래스 전체에 사용되는 공통 URL 설정을 한다.
    • 마찬가지로 CoffeeController와 OrderController 구조 작성

📖 핸들러 메서드 (Handler Method) 적용

  • 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() : 커피 목록을 제공하는 핸들러 메서드

📖 응답 데이터에 ResponseEntity 적용

  • 코드 개선하기
    • 응답으로 전송하는 JSON 형식의 문자열을 수작업으로 작성하는 부분
    1. 클래스 레벨의 produces 애트리뷰트 삭제
    2. JSON 문자열을 수작업으로 작성하던 부분이 Map 객체로 대체 (JSON 형식으로 자동 변환)
    3. 리턴 값으로 JSON 문자열을 리턴하던 부분이 ResponseEntity 객체를 리턴하는 것 변환
      생성자 파라미ㅓ로 응답 데이터(map)와 HTTP 응답 상태를 함께 전달
      (https://developer.mozilla.org/ko/docs/Web/HTTP/Status - 응답 상태 종류)

📜 Controller 구현 실습 과제


profile
코린이의 공부 일지

0개의 댓글