Spring Boot
스프링 애플리케이션을 쉽게 만들고, 배포할 수 있도록 도와주는 프레임워크이다.
말이 너무 어려워....
Spring Boot는 WAS의 한 종류인 Tomcat을 실행 버튼 한번으로 자동으로 띄워준다.

내장 톰캣 서버를 스프링 부트가 띄우면 안에 서블릿 컨테이너라는 것이 생긴다.

이 서블릿 컨테이너 안에는 서블릿이라는 것이 있다.
서블릿
HTTP 요청 메세지를 바탕으로 request와 response에 요청에 맞는 데이터를 생성하여 response에 담는 역할을 한다.
그럼 우리가 구현해야 하는 부분은 어디일까?

스프링은 위와 같이 3개의 레이어로 이루어져있다.
1. Controller Layer
api url과 1:1 로 맵핑되어 url로 들어오는 요청을 서블릿으로 받아오는 역할을 한다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/member")
public class MemberController {
@GetMapping("/{memberId}")
@Operation(summary = "회원정보 조회")
public ResponseEntity<Object> getMemberById(@PathVariable Long memberId) {
return ResponseEntity.ok(memberService.getMemberById(memberId));
}
}
/member/{memberId} 로 들어오는 요청을 받아온다
2. Repository Layer
DB에 저장되어 있는 실제 데이터를 가져오는 역할을 한다.
@Entity
@SuperBuilder
@NoArgsConstructor
public class Member extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)//mysql의 auto increment
private Long id;
@Column
private String name;
@Column
private String phoneNumber;
@Enumerated(EnumType.STRING)
private Role role;
public Member(String name, String phoneNumber, Role role) {
this.name = name;
this.phoneNumber = phoneNumber;
this.role = role;
}
3. Service Layer
controller가 매핑해 온 요청을 받아 실제 데이터를 처리 및 생성하는 역할을 한다.
repository가 DB에서 가져온 데이터를 가공하는 역할을 한다.
public MemberInfoResponse getMemberById(Long memberId) {
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new NotFoundException(ErrorCode.MEMBER_NOT_FOUND));
return MemberInfoResponse.from(member);
}

Spring Boot는 크게 servlet container와 spring container로 나누어진다.
- servlet Conatiner의 Dispathcer Servlet이란 서블릿이 http 메세지를 Spring Container에 전달
- 전달된 http 요청을 Handler Mapping이 구현한 해당 요청에 알맞은 controller에 매핑
- controller는 해당 http 메세지를 java 코드로 받아와 service에게 전달
- service는 respository에게 DB에서 데이터를 가져오라고 한 후 해당 요청에 맞게 데이터를 가공
- respository는 DB에서 데이터를 가져와 model 클래에 맞는 java 코드로 변환하여 service에 전달
Spring Boot는 위 과정을 자동으로 제공해주며
Controller Layer Repository Layer Service Layer
계층만 구현해주면 된다.
