컨트롤러 클래스
- 정의/목적 : 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 |