Spring MVC에서 클라이언트 요청의 최종 목적지인 Controller 클래스
기능 기반 패키지 구조(package-by-feature)

계층 기반 패키지 구조(package-by-layer)

Spring Boot 는 테스트와 리팩토링이 용이하고, 향후에 마이크로 서비스 시스템으로의 분리가 상대적으로 용이한 기능 기반 패키지 구조 사용을 권장
REST API 기반의 애플리케이션에서는 애플리케이션이 제공해야 될 기능을 리소스(Resource, 자원)로 분류
위 기능의 애플리케이션에는 아래와 같은 리소스가 필요

‘Spring Initializr’를 통해 생성한 프로젝트에는 엔트리포인트 클래스가 이미 작성되어 있음
@SpringBootApplication : 자동 구성 활성화SpringApplication.run(Section3Week1Application.class, args); : Spring 애플리케이션을 부트스트랩하고, 실행
@RestController : API 엔드포인트로 정의, 로딩 시, Spring Bean으로 등록@RequestMapping : 클라이언트의 요청과 요청을 처리하는 핸들러 메서드(Handler Method)를 매핑 
클라이언트의 요청을 처리하고 필요한 비즈니스 로직을 실행시켜 응답을 반환하는 역할
produces 애트리뷰트 : 클라이언트에게 전송할 응답 데이터의 미디어 타입 설정MediaType.APPLICATION_JSON_VALUE : JSON 형식으로 설정
@PostMapping : POST 핸들러 메서드 정의 (URI 미지정해 기본경로 호출)@RequsetParam : 쿼리 파라미터에서 값을 추출
그런데, 응답값을 개발자가 매번 수작업으로 JSON 문자열로 작성하는 것은 번거롭고 오타의 가능성이 높다. Map 객체로 대체하자.
그리고, Map 객체 리턴 시 Spring MVC 내부적으로 JSON 형태로 자동변환 해주기 때문에 produces 애트리뷰트 지정은 불필요!


POST 핸들러 메서드에게 요청을 전송 시 '200 OK' 출력.
그러나 HTTP 응답 상태 코드를 처리 결과를 좀 더 명확히 알 수 있도록 커스텀하고 싶다면?
ResponseEntity : httpentity를 상속받는, 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스
HttpStatus.CREATED : "201 Created" , 요청 성공 & 새로운 리소스 생성 완료
@GetMapping@PathVariable : URI 경로에서 값을 추출, 경로명과 동일해야한다

🙋♀️ POST 메서드는
@PostMappingURI 지정 안했는데? GET 메서드에서@GetMapping는 왜 경로 지정해?매핑 시 경로를 지정한 getMember() 메서드는 '특정 회원' 을 조회해야 하기 때문에 '회원 식별자' 로서 경로를 지정했어. 이처럼 필요에 따라 경로를 지정할 수 있어.
경로를 지정하지 않으면@RequestMapping의 기본 경로를 호출해.