Servlet은 간단히 말하자면 CGI를 개선해서 동적 페이지를 생성해주기 위한 서버 프로그램, 자바 클래스이다. 추후에 다룰 예정이다.

클라이언트에서 요청은 Dispatcher Servlet이 먼저 처리한다. 프론트 컨트롤러 라고도 한다.

Dispatcher Servlet은 요청에 매핑된 적절한 Controller를 찾아 요청을 위임한다. 과거엔 Servlet이 web.xml에서 맵핑된 URL을 찾아주어야 했지만, Dispatcher Servlet을 통해 Controller만 적절히 구현해두면 알아서 적절하게 요청을 위임해주게 되었다.

 

  // Servlet alias
  <servlet>
  	<servlet-name>HelloServlet</servlet-name>
  	<servlet-class>test.servlet.HelloServlet</servlet-class>
  </servlet>
  
  // URL에 필요한 Servlet을 맵핑 시켜준다
  // /hello 경로로 요청이 오면 HelloServlet으로 요청 위임
  <servlet-mapping>
  	<servlet-name>HelloServlet</servlet-name>
  	<url-pattern>/hello</url-pattern>
  </servlet-mapping>

/hello 경로로 요청이 오면 HelloServlet을 통해 페이지를 제공하는 web.xml의 예시이다.

 

각 레이어 간 데이터 이동은 DTO(Data Transfer Object)를 이용한다.

DTO는 데이터 전송을 위해 getter, setter메소드만 가지고 비즈니스 로직을 가지지 않는 간단한 객체이다.

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class CommentListItem {
	private String nickname;
	private String profileImage;
	private String writeDatetime;
	private String content;
}

댓글에 관한 DTO

 

Controller는 위에서 말했듯이 요청에 대한 처리를 위임받아 적절한 처리를 한 후에 Response, 혹은 패턴에 따라 View에 넘겨주는 비즈니스 로직을 처리하는 객체이다.

@RestController
@RequestMapping("api/v1/auth")
@RequiredArgsConstructor
public class AuthController {
	
	private final AuthService authService;
	
	@PostMapping("/sign-up")
	public ResponseEntity<? super SignUpResponseDto> signUp(
		@RequestBody @Valid SignUpRequestDto requestBody
		) {
			ResponseEntity<? super SignUpResponseDto> response = authService.signUp(requestBody);
			return response;
	}	


	@PostMapping("/sign-in")
	public ResponseEntity<? super SignInResponseDto> signIn(
		@RequestBody @Valid SignInRequestDto requestBody
	){
		ResponseEntity<? super SignInResponseDto> response = authService.signIn(requestBody);
		return response;
	}
	
	
}

회원가입과 로그인에 관한 Controller 예시이다. 

Mapping 어노테이션을 통해 요청, 경로에 대한 맵핑을 하고 그에 따른 처리 코드를 작성한다.

위에서 xml 파일에서 URL 맵핑을 설정하는 과정과 비슷하다고 볼 수 있다.

예시를 살펴보자면

1. 로그인, 또는 회원가입에 필요한 데이터를 DTO 인자로 받는다. (requestBody)

2. service객체의 메소드를 호출해 데이터베이스 작업

3. ResponseEntity로 감싸서 response 반환

위의 그림(client, controller, service, repository) 에서 client <-> controller 까지의 과정이라고 볼 수 있다.

 

다음 글에서 controller 이후 계층에 관해서 작성해보겠다.