TIL-Spring 기초 4주차 (25.03.18)

kb·2025년 3월 18일

Spring

목록 보기
4/21

4-1. Spring Annotation 1강

  • Slf4j ... Slf4j는 인터페이스이고, 그 구현체로 Logback 같은 라이브러리를 선택. 실제 개발에서는 Spring Boot가 기본으로 제공하는 Logback을 대부분 사용
    • logging ... Thread 정보, 클래스 이름과 같은 부가 정보를 함께 확인. 실제 운영 환경에서는 System.out.println();을 사용하여 Console에 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용해 로그를 출력. Log Level 설정을 통해 Error 메세지만 출력하도록 하기도 하고, 로그 메시지를 일자별로 모아서 저장해 외부 저장소에 보관하기도 함.
      • Log Level: TRACE > DEBUG > INFO > WARN > ERROR
  • Controller VS @RestController ... Annotation 기반의 Spring에서 Controller(Handler)를 만들 때 사용하는 어노테이션
    • @Controller: View가 있는 경우에 사용 (즉, Template Engine인 Thymeleaf, JSP 등을 사용하는 경우)
    • @RestController: 응답할 Data가 있는 경우에 사용. (현재는 대부분 @RestController를 사용하여 API가 만들어짐(Resful API). return 값으로 View를 찾는 것이 아니라 HTTP Message Body에 Data를 입력함)

4-2 Spring Annotation 2강

  • Annotation 자세히 보기 ... Spring에서 사용하는 Annotation들이 각각 어떤 역할을 수행하는지 알아보는 방법 학습하기 -> 모르는 Annotation이 나올 경우 어떻게 사용해야 하는지 스스로 찾아낼 수 있음.
    • @Component ... Spring Bean에 등록하는 역할 수행. Spring Bean은 Application의 구성 요소를 정의하는 객체
      • @Indexed ... 클래스가 컴포넌트 스캔의 대상으로 Spring Bean에 더 빠르게 등록되도록 도와줌 (숙련 주차에서 자세히 다룰 것)
    • @Target ... @Target이 선언된 하위 어노테이션이 어떤 범위에 적용되는지 설정.
      • ElementType Enum 속성(각각의 Enum마다 적용되는 범위가 상단에 주석으로 설명되어 있음)
    • @Retention ... @Retention 하위의 어노테이션이 얼마나 오래 유지되는지를 결정.
      • RetentionPolicy Enum 속성 ... 1. SOURCE(소스 코드(.java)에서만 유지. 컴파일러에 의해 클래스 파일로 저장되지 않음) 2. CLASS(컴파일된 클래스 파일(.class)에 저장되지만, JVM이 실행 시 읽지 않는다.(주석과 같음). Default값임) 3. RUNTIME(클래스 파일(.class)에 저장되고, JVM에 의해 런타임 시점에 읽을 수 있음. 즉, 실제 런타임 시점의 코드에 반영되어 영향을 줌)
    • @Documented ... Javadoc 등의 문서화 도구에 의해 문서화되어야 함을 나타냄
  • 다시보는 @Controller VS @RestController ... 개발에서 우선순위는 항상 자세히 선언된 것이 우선순위가 높다
    • @Controller 다시보기
      • @Target(ElementType.Type) ... Class, Interface, Annotation, Enum, Record Declaration(Java16)에 적용할 수 있음
      • @Retention(RetentionPolicy.RUNTIME) ... 클래스 파일(.class)에 저장되고, JVM에 의해 런타임 시점에 읽을 수 있음
      • @Document ... Javadoc 등의 문서화 도구에 의해 문서화되어야 함을 나타냄
      • @Component ... Spring Bean에 등록 / 싱글톤으로 관리
    • @RestController 다시보기
      • @Controller에 @ResponseBody가 결합된 어노테이션
      • @RestController는 @Controller와 달리 각 메서드마다 @ResponseBody를 추가하지 않아도 된다.

4-3 Request Mapping 1강

  • RequestMapping ... 특정 URL로 Request를 보내면 들어온 요청을 Controller 내부의 특정 Method와 Mapping 하기 위해 사용/ Client로부터 요청이 왔을 때 어떤 Controller가 호출될지 Mapping하는 것은 단순히 URL로 Mapping하는 것이 아니라 여러가지 요소(URL, Method 등)를 조합하여 Mapping함.
    • @RequestMapping
      • URL path/example 만 허용(Spring Boot 3.0버전 이상)
      • 속성값 설정 시 배열 형태로 다중 설정 가능 (ex. @RequestMapping({"/example", "/example2", "/example3"})
      • HTTP Method POST, GET, PUT, PATCH, DELETE, HEAD 모두 허용
      • method 속성으로 HTTP 메서드를 지정하면 지정한 것만 허용됨.
      • Spring이 제공하는 Annotation들의 내부에 다 선언되어 있음. 사용하면 됨. @RequestMapping보다는 직관적이고 축약된 @GetMapping, @PostMapping 형식을 일반적으로 사용 (@PutMapping, @DeleteMapping, @PatchMapping)
      • 위의 Method Mapping의 Target은 Method Level임. 반면, @RequestMapping의 Target은 class, method 레벨에 적용 가능.
      • Restful API의 계층 구조 ex. users/{userID}, category/{categoryId}/product/{productId}
      • prefix로 선언할 URL을 class 레벨에 적용하는 것이 주로 사용.
  • PathVariable ... HTTP 특성 중 하나인 비연결성을 극복하여 데이터를 전달하기 위한 방법 중 하나. URL로 전달된 값을 파라미터로 받아오는 역할을 수행.
    • @PathVariable
        1. 경로 변수를 중괄호 {}에 둘러싸인 값으로 사용할 수 있다. (ex. user/{id}
        1. @PathVariable로 설정된 경로 변수는 반드시 값을 가져야 하며, 값이 없으면 응답 상태코드 404 Not Found Error가 발생
        1. 최근 Restful API를 설계하는 것이 API의 기준이 되며 해당 어노테이션의 사용 빈도가 높아짐 > Restful API를 설계하게 되면 URL path 만으로 어떤 Resource을 사용하는지, HTTP Method 만으로 어떤 기능이 동작되는지 쉽게 알아볼 수 있음.
    • Restful API ... C(POST), R(GET), U(PUT, PATCH), D(DELETE)
    • Restful API 설계 예시
    • @PathVariable 규칙
        1. 파라미터 변수명과 PathVariable 변수명이 같으면 속성 값 생략 가능 ... GetMapping("/{postId}")에 Long data 값을 지정해줌. 이걸 @PathVariable Long postId로 해서 파라미터 변수명 postId와 PathVariable 변수명을 같게 해줄 수도 있음
        1. @PathVariable 다중 사용 가능 - 이렇게 postId와 commentId 두 개를 상속했다.
      • 다음과 같이 /posts/{postId}까지를 상위 Class의 prefix로 뺄 수 있음

4-4 Request Mapping 2강

  • 특정 파라미터 매핑 ... 속성 설정을 통해 특정 헤더, 특정 파라미터와 Mapping 할 수 있다.
      1. Parameter 추가 매핑
      • 예시
      • 속성 작성 규칙
      1. 특정 Header 매핑
      • 예시 헤더의 타입을 지정. ... POSTMAN에서 Body에 json 형태가 지정되어 있어야 호출 됨.
      1. MediaType 매핑, consume(수용) ... HTTP Header Content-Type(요청)과 매핑됨. consummes 속성 value 값으로는 이미 Spring에서 제공되는 Enum인 MediaType.APPLICATION_JSON_VALUE 형태로 사용
      • 속성 작성 방법
      1. MediaType 매핑 produces(제공) ... 요청 헤더의 Accept 값에 따라서 produces 하는 값이 변함.
      • consumes 속성 사용법과 같음. 위에 나온 모든 MediaType은 Spring이 제공하는 Enum을 사용하면 됨. (ex. produces = "application.json" -> produces = MediaType.APPLICATION_JSON_VALUE)
  • Spring이 지원하는 Parameter ... 어노테이션 기반 Spring의 Controller는 다양한 파라미터를 쉽게 사용할 수 있도록 지원함
    • @Controller 파라미터 목록 공식문서가 있음
    • @Controller의 사용 가능한 Response 값 목록 공식 문서가 있음
    • HTTP 헤더 조회 ... Spring에서 요청 Header에 쉽게 접근 가능. HttpServletRequest와 같이 파라미터로 다룰 수 있음.
    • MultiValueMap ... Map과 유사하게 Key, Value 형식으로 구현. 하나의 Key가 여러 Value를 가질 수 있음. HTTP Header, Request Parameter와 같이 하나의 Key에 여러 값을 받을 때 사용함. (ex. key1=value1&key1=value2

어렵다! @Annotation을 활용해서 컨트롤러를 맵핑시키고, 파라미터나 consume, produce, PathVariable로 매핑 규칙을 정해주는 것 같은 느낌인데, 맞게 이해했는지 모르겠다. 전반적으로 다시 훑어볼 필요가 있을 듯. 일단, 쭉 스키밍해보고 다시 이해해보자. 고생했다!

profile
Experience

0개의 댓글