Spring/기본 구성

4. Controller 클래스 with. DTO

초코chip 2024. 1. 18. 14:49

컨트롤러 클래스

  • 정의/목적 : HTTP 요청과 메서드를 연결해주는 라우터 역할

 

클래스 애너테이션

Controller vs RestController

@Controller

  • 목적 : View 이름 반환 or 데이터(Json/XML)을 반환하는 용도로 사용
View를 반환 Data를 반환

1. 컨트롤러에서 View 이름을 반환
2. 디스패치 서블릿에서 뷰 리졸버를 통해 View를 반환

1. 컨트롤러에서 객체를 ResponseEntity로 감싸서 반환
p.s) ResponseEntity는 @ResponseBody를 사용

 

@RestController

  • @Controller에 @ResponseBody가 추가된 것
    • 그렇기에 @Controller에서 @ResponseBody를 붙인 것과 완벽히 동일하게 동작
  • 목적 : Json 형태로 객체를 반환하는 것 용도로 사용
@RestController
@RequiredArgsConstructor
public class Controller {
    private final Service service;
}

 

@RequestMapping

  • 정의/목적: 공통 주소를 표현하는 것
  • 사용 방법: () 안에 "공통 주소"를 입력
  • 예시
@RestController
@RequestMapping("/")
public class Controller {
	...
}

 

 

메서드 애너테이션

@Get/Post/Put/DeleteMapping

  • 정의/목적: 공통 주소외 나머지 하위 주소를 표현한 것
  • 사용 방법: () 안에 "하위 주소"를 입력
  • 예시:
    @GetMapping("/student/id/") /
    public Optional<Student> findByStudentId() {
        ...
    }

 

 

요청값 받기

HTTP 요청 메시지 형식

POST /userInfo
Host: www.example.com
Content-Type: applicationjson
Content-Length: 35
{
	"userInfo":
	{
		"userName":"honggildong",
		"userNickname":"Mr. Hong"
	}
}

 

@PathVariable

  • 정의: URL 경로에서 값을 추출하여 변수와 매핑해주는 애너테이션
  • 목적: URL 경로에 변수가 있을 경우 사용 (예시 "/example/{id}")
  • 사용 방법: 매핑하고자 하는 변수 앞에 애너테이션 삽입
    • 이때, 경로 변수와 매핑 변수의 이름은 동일한 것을 추천
  • 예시:
@GetMapping("/student/id/{id}")
public Optional<Student> findByStudentId(@PathVariable Long id) {
	...
}

 

@RequestBody

  • 정의: HTTP Body에서 json 기반의 값을 추출하여 자바 객체(Dto)로 매핑해주는 애너테이션
  • 목적: HTTP Body에 json 형식의 값이 있을 경우 사용
  • 사용 방법: DTO 객체 정의 + 매핑하고자 하는 객체 앞에 애너테이션 삽입
  • 예시
@PostMapping("/example")
public String example(@RequestBody SomeObject someObject) {
	....
}

 

DTO

데이터 전송 객체(Data Transfer Object)

  • 정의: 계층끼리 데이터를 교환하기 위해 사용되는 객체
  • 목적: 클라이언트(View)와 데이터를 교환할때 사용
  • 왜 엔티티를 사용하지 않고 DTO를 사용해서 받는가?
    • 엔티티에 변질을 막을 수 있고
    • 로직에 맞춰 필요한 필드만 선택 가능
  • 특징: JSON <-> 자바 객체의 변환이 발생
    • 직렬화(serialization): 자바 객체 -> Json 변환 과정(서버 -> 클라이언트), ResponseBody를 사용할 때 발생
    • 역직렬화(deserialization): Json -> 자바 객체 변환 과정(클라이언트 -> 서버), RequestBody를 사용할 때 발생

  • 위치: dto 패키지를 생성하여 보관
  • 사용 방법
    • 직렬화(객체->json): @Getter 필수
    • 역직렬화(json->객체): @Getter와 @NoArgsConstructor 필수
    • 그 외 상황: 위 2개는 필수적이고 나머지는 상황따라 잘 추가해주면 된다. 
      • 빌더 패턴 사용(@Builder): @AllArgsConstructor
      • @Setter: DTO 객체 값 변경하려면 사용
    • 참고: https://codingwell.tistory.com/182
@NoArgsConstructor
@Getter
public class Dto {
    private String parameter1;
    private String parameter2;
}

 

https://chocochip125.tistory.com/170

 

+4. DTO를 record type으로 설정

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.

chocochip125.tistory.com

 

 

@RequestParam

  • 정의: HTTP URL에서 쿼리 스트링 값을 추출하여 변수와 매핑해주는 애너테이션
  • 목적: URL에 쿼리 스트링이 있을 경우 사용 (예시 "example.com/example?paramName=value")
  • 사용 방법: 매핑하고자 하는 변수 앞에 애너테이션 삽입
    • 이때, 쿼리 변수와 매핑 변수의 이름은 동일한 것을 추천
  • 예시
@GetMapping("/example")
public String example(@RequestParam String paramName) {
	....
}

 

 

@RequestHeader

  • 정의: HTTP Header에서 값을 추출하여 변수와 매핑해주는 애너테이션
  • 목적: HTTP header에 의미있는 값이 있을 경우 사용
  • 사용 방법: 매핑하고자 하는 변수 앞에 애너테이션 삽입
    • 애너테이션에 Header에 있는 변수의 key값을 입력 (예시 @RequestHeader("Content-Length"))
  • 예시: 헤더 내용 - Content-Length: 35
@PostMapping("/userInfo")
public String handleUserInfoRequest(@RequestHeader("Content-Length") long contentLength) {
   ....
}

 

@ModelAttribute

  • 정의: Http Body에서 파라미터 기반의 값을 추출하여 객체(Dto)로 매핑해주는 애너테이션
  • 목적: HTTP Body에 파라미터 기반의 값(Form값)이 있는 경우 사용
  • 사용 방법: DTO 객체 정의 + 매핑하고자 하는 객체 앞에 애너테이션 삽입
  • 예시
@PostMapping("/example")
public String example(@ModelAttribute SomeObject someObject) {
	....
}

 

 

+) 파일 요청 받기

https://chocochip125.tistory.com/173

 

스프링 파일 첨부 요청 처리

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.

chocochip125.tistory.com

 

반환값 형태

 

'Spring > 기본 구성' 카테고리의 다른 글

6. ORM 개념 with. Spring Data JPA  (0) 2024.01.18
5. Service 클래스  (0) 2024.01.18
3. Spring Boot 구조  (0) 2024.01.18
2. Spring Boot 프로젝트 디렉토리 구성  (0) 2024.01.18
1. 프로젝트 생성방법 with. InteliJ  (0) 2024.01.18