[Spring] Annotation 정리하기

말하는 감자·2025년 3월 19일

내일배움캠프

목록 보기
22/73

오늘은 뭐 앞뒤가 이어지는 형식은 아니고
강의를 많이 듣다보니 중간중간 알아둘 키워드가 있는 것 같아서 정리하려고 한다.

사실 집중이 안돼서 전부 필기로 노트에 작성했는데 이러면 모아보기 힘들니깐 여기다가 옮겨적기....겸 복습

Controller

Controller Annotation에는 두가지 종류가 있다.
Controller 어노테이션은 Spring에서 Handler(=Controller)를 만들 때 사용된다.

@Controller

얘는 반환할 때 view(HTML)가 있음

@Controller
public class ViewController {

    @RequestMapping("/view")
    public String example() {
        return "index"; 
    }
}

여기서 리턴을 index로 했는데 이럼 index.html이나 index.jsp같은 view가 있으면 그 페이지를 반환한다.

📌 Templete Engine (Thymeleaf, JSP)을 사용하는 경우에 해당 어노테이션이 쓰인다.

Thymeleaf 사용시
SpringBoot build.gradle에 의존성 추가해줘야 한다.
implementation 'org.springframework.boot::spring-boot-starter-thymeleaf'
rm



@RestController

얘는 데이터를 반환한다. 뭐.... Json/XML이런거

  • 현재는 대부분 @RestController를 사용하여 API가 만들어진다.
    • Restful API 를 위해서 오가는 데이터가 자신을 설명할 수 있어야 하기 때문..........?
  • return 값으로 View를 찾는것이 아니라 HTTP Message Body에 Data를 채우는 형식이다.
@RestController
public class ResponseController {

    @RequestMapping("/string")
    public String example() {
        // logic
        return "sparta"; // ViewName이 return 되는게 아니라, String Data가 반환된다.
    }
    
}

이렇게 Controller(=Handler)가 뱉는 리턴값이 view가 아니라 데이터가 되면,
기존에 알고 있던 SpringMVC의 특정 단계가 없어짐

원래는 8. Mdoel And View 반환-> 알맞은 응답으로 조립 단계가 8.Date를 응답으로 바뀌어버림
이 이유는 아래에 설명하는 @Responsebody와 관련이 있다.






@RequestMapping

클래스, 함수 앞에 붙는 어노테이션으로

  • url 주소 매핑
  • HTTP Method 지정
  • + 나중에 나오는 @PathVariable도 요거 쓸 때 쓰인다.

해당 RequestMapping이 존쟁하는 클래스에 속한 메서드들은
RequestMapping 안의 경로에서 접근 가능하다.

기본

@RequestMapping(value = "/v1", method = RequestMethod.GET)

method = RequestMethod.GET이외에도 POST/DELETE/PUT/PATCH등 필요한 메소드 사용 가능함.


📌RequestMapping에서 Method 생략하기

  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping
  • @GetMapping
    이런식으로 Request자리에 필요한 HTTP 메서드 집어넣으면댐

어....이건 노트그냥 붙이는게 낫겠다






@PathVariable

HTTP 요청할 때 URI에 데이터를 싣는 방법
{} 중괄호로 표현한다.

@RequestMapping(value = "/post/{postId}")

이런식으로 사용하고 {posId}postId는 이제 uri에서 집어늫는 값에 따라 바뀌게 된다.


데이터를 받아오는 방법

1️⃣ public String 함수이름(@PathVariable("postId") Long data)

  • 함수가 {postId} 값을 data로 이름 바꿔서 받아오겠다.

2️⃣public String 함수이름(@PathVariable Long postId)

  • 함수 파라미터 이름이 중괄호 안에 들어가는 변수 명과 같은 경우,
    따로 @PathVariable("postId")같은 구문 필요 X



📌 @PathVariable 사용 시 주의 사항

✔️ 기본적으로 @PathVariable로 설정된 경로 변수는 반드시 값을 가져야 하며
값이 없으면 응답 상태코드 404 Not Found Error가 발생

✔️ @PathVariable 다중 사용 가능
@GetMapping("/{postId}/comments/{commentId}") 이런식으로 사용가능






@RequestMapping 의 Params

http://localhost:8080/경로/...?key=value인 url로 접근 가넝

@__Mapping Annotation의 여러 파라미터

강의에서는 header에 들어가는 파라미터 종류를 꼽아줬고, postman에서 header안에 들어가는 값들을 확인할 수 있다.

headers같은 파라미터의 경우 뒤 스트링에서 key=value형태로 지정가능
comsumes는 헤더의 Content-Type을 지정하는 것이고
producesAccept 값을 고칠 수 있음.






Client -> Server 데이터 전달 방법

1️⃣ @RequestParam - Get + Query Parameter(Query String)

  • URL의 쿼리 파라미터를 사용하여 데이터 전달하는 방법
http://localhost:8080/request-params?key1=value1&key2=value2



2️⃣ @RequestParam - POST + HTML Form ( x-www-form-urlencoded )

  • HTTP Request Body에 쿼리 파라미터 형태로 전달하는 방법

    url에 직접적으로 표기되지않고, body에서 key, value를 작성할 수 있음
    보통 HTML에서 <Form> 태그쓸 때 이런식으로 들어가니깐 그거 상상하면서 매칭하면 될듯.

@ModelAttribute

얘는 다른 두개랑 다르게 받아오는 형태를 java의 클래스로 지정해두는거임
그 클래스는 앞에 @Data를 달고있어서 자동 Getter, Setter @EqualsAndHashCode, @RequiredArgsConstructor등 기본적으로 필요한 함수 만들어주고
@_Mapping어노테이션이 사용된 함수의 파라미터로 해당 클래스가 들어오면
자동으로 객체 만들어줌

⚠️@Data 는 테스트 용도로만 사용하고 실무에서는 잘 사용하지 않는다.

참고로 포스트맨에서 데이터 입력할 떄는

( x-www-form-urlencoded ) 활용해준다.



3️⃣ HTTP Request Body

  • 데이터(JSON, TEXT, XML 등)를 직접 HTTP Message Body에 담아서 전달한다.
  • 주로 @RestController에서 사용하며, 대부분 JSON 형식으로 데이터를 전달한다.
    • POST, PUT, PATCH Method에서 사용한다.
    • GET, DELETE Method는 Body에 데이터를 담는것을 권장하지 않는다.

JSON을 Java 객체로 변환하려면 Jackson과 같은 라이브러리를 사용해야 한다.
Spring Boot는 기본적으로 Jackson 라이브러리의 ObjectMapper를 제공하며, starter-web에 포함되어 있다.

따라서, Spring BootJSON을 Java 객체변환을 기본으로 제공해줌






3️⃣ HTTP Request Body에 Data가 전송되는 방법

✔️HttpMessageConverter

HttpMessageConverter는 Spring Framework에서 HTTP 요청과 응답을 변환하는 인터페이스이다.
클라이언트와 서버 간에 데이터를 주고받을 때,

1️⃣ 요청 데이터를 자바 객체로 변환하거나
2️⃣ 자바 객체를 응답 본문으로 변환하는 역할을 수행한다.

request, reesponse 메시지를 개봉/포장 하는 역할이라는 뜻

아래는 사용방법...

  • 이제부터 배울 내용은 HTTP Message Body에 직접적으로 Data가 전달되는 경우







HttpServletRequest

위에서 거의 지금까지 썻던 기본형태

Request,Response객체를 각각만들고 스트림을 통해서 값을 받아와서 writer를 통해 응답한다.



I/O

위에서 썼던 Request,Response객체를 째로 들고오지 않고 필요한 스트림Writer를 파라미터에서 바로 받아옴


📌메서드에 throws IOException이 있는 이유



✳️HttpEntity

HttpEntity는 HTTP Header, Body 정보를 편리하게 조회할 수 있도록 만들어준다.


HttpEntity 역할

1. Http Request Body Message를 직접 조회한다
2. Request 뿐만 아니라 Response도 사용할 수 있도록 만들어준다.
3. Response Header 또한 사용할 수 있다.
4. Request Parameter를 조회하는 기능들과는 아무 관계가 없다.
5. View를 반환하지 않는다. (@RestController 라는 소리겠찌?)
6. ‼️HttpMessageConverter을 사용한다

하지만 DatahttpEntity에서 꺼내어 사용해야 한다는 불편함이 있음


  • HttpEntity를 상속받은 객체
    • RequestEntity<>
      • HTTP Request Method, URL 정보가 추가 되어있다.
    • ResponseEntity<>
      • HTTP Response 상태 코드 설정이 가능하다.





HttpEntity 에 대한 설명은 다음시간에 계속 . . ..

profile
대충 데굴데굴 굴러가는 개발?자

0개의 댓글