Spring - 챌린지반 2주차

ChoRong0824·2025년 1월 23일
0

Web

목록 보기
27/51
post-thumbnail

Spring MVC의 주요 Interface

Spring MVC는 DispatcherServlet 코드의 변경 없이 기능 변경 및 확장이 가능ㅎ다ㅏ. (대부분 interface로 만들어졌기 때문)
-> interface를 implements 하여 구현하면 내가 만든 클래스를 사용할 수 있다(다형성)

  1. HandlerMapping
  2. HandlerAdapter
  3. ViewResolver
  4. View
  • 모든 내부의 구조를 세세하게 알 필요는 없지만, 어떤 부분에서 문제가 발생했는지를 알기 위해, 전체적인 동작 방식을 알아야합니다.

@Component

  • Spring Bean에 등록하는 역할을 수행
    - Spring Bean은 app의 구성 요소를 정의하는 객체
    - 마치 Servlet이 Servlet Container에 등록되는 것과 같다.

@Slf4j

Slf4j는 인터페이스이며, 그 구현체로 Logback같은 라이브러리를 선택한다.
실제 개발에서는 Spring Boot가 기본으로 제공하는 Logback을 대부분 사용한다.
이젠 System.out.println();이 아닌 해당 어노테이션을 통해 로그를 찍어서 확인해봐야한다. (설정 파일에 설정 해둬야함 얌파일이면 얌파일에, properties라면 해당 파일)

로그를

log.tarc("문자 trace={}", sparta);
log.info("문자 info " + sparta);

+는 문자열과 문자열을 더해주는 것이며, 출력하지 않게 설정했음에도 불구하고 (문자열 연산은 무조건 하게 되어있다)불필요한 동작을 수행하게 되기 때문에 항상 로그를 사용할 때는 {}를 써서 치환해주게끔 코드를 구성하는 것이 중요하다.

객체를 로그 찍으면, 객체의 주소 값이 로깅으로 출력되는 것을 확인할 수 있다.


@Controller

View가 있는 경우에만 사용한다.

@RestController

응답할 Data가 있는 경우에만 사용한다.


Reqeuest Mapping

URL
DeleteMapping, PostMapping이렇게 바로 어노테이션을 붙이면 되는거 아닌가 ?
-> 이러한 것들의 Target은 Method Level이다.
반면에, @Request Mapping 의 Target은 class, method 레벨에 적용이 가능하다.

즉, 쉽게 말해 클래스 레벨에서는 Request Mapping을 쓰면 되는 것이고, 메서드 레벨에서는 @GetMapping 등 직관적인 어노테이션을 쓰면 된다는 말이다.


client에서 server로 data를 전달하는 방법

이것은 3 가지 방법 이외에는 없기 때문에 꼭 외우주시는 것이 좋습니다!

  1. GET + Query Parameter
  2. POST + HTML Form(x-www-form-urlencoded)
    HTTP Request Body에 쿼리 파라미터 형태로 전달하는 방법
    (POST메서드에 HTML Form 데이터 형태로 데이터를 전달하는 방법)
  3. HTTP Request Body
    HTTP 요청 Message Body에 데이터를 입력하는 방법

HTTP MessageConverter

  • canRead(), canWrite() 메서드: 메시지 컨버터가 해당 클래스 혹은 미디어타입을 지원하는지 체크하는 용도
  • read(), write() 메서드: 메시지 컨버터를 통해서 메시지를 읽고 쓰는 기능 지원

HTTP 요청 데이터 읽는 과정

HTTP 요청이 들어오고, 컨트롤러에서 @RequestBody 혹은 HttpEntity 파라미터 사용하는 상황
MessageConverter가 메시지를 읽을 수 있는 확인하기 위해 canRead() 메서드 호출 (대상 클래스 타입을 지원하는지, HTTP 요청의 Content-Type 미디어 타입을 지원하는지 체크)
canRead() 조건을 만족할 경우 read() 메서드를 호출해서 객체 생성 후 반환

HTTP 응답 데이터 생성하는 과정

컨트롤러에서 @ResponseBody 혹은 HttpEntity로 값이 반환되는 상황
MessageConverter가 메시지를 쓸 수 있는지 확인하기 위해 canWrite() 메서드 호출 (대상 클래스 타입을 지원하는지, HTTP 요청의 Accept 미디어 타입을 지원하는지 체크)
canWrite() 조건을 만족할 경우 write() 메서드를 호출해서 HTTP 응답 메시지 바디 내 데이터 생성

주로 사용하는 메시지 컨버터 세 가지 (우선순위 순)

ByteArrayHttpMessageConverter
StringHttpMessageConverter
MappingJackson2HttpMessageConverter

  • 앞서 언급한 대로 스프링에서 메시지 컨버터를 선정할 때 대상 클래스 타입과 미디어 타입을 체크 후 사용 여부를 결정하고, 만족하지 않을 경우 다음 우선순위에 있는 메시지 컨버터로 넘어가 체크 진행

ByteArrayHttpMessageConverter

byte [] 데이터 처리
클래스 타입: byte []
미디어 타입: /
HTTP 요청 예시: @RequestBody byte [] example
HTTP 응답 예시: @ResponeBody return byte[] (쓰기 MediaType: application/octet-stream)

StringHttpMessageConverter

String 문자열로 데이터 처리
클래스 타입: String
미디어 타입: /
HTTP 요청 예시: @RequestBody String example
HTTP 응답 예시: @ResponseBody return example (쓰기 MediaType: text/plain)

@RequestMapping
String stringHttpMessageConverterExample(@RequestBody String example){
	return example;
    
}

4.3 MappingJackson2HttpMessageConverter

application/json 처리
클래스 타입: 객체 또는 HashMap
미디어 타입: application/json
HTTP 요청 예시: @RequestBody Example example
HTTP 응답 예시: @ResponseBody return example (쓰기 MediaType: application/json)

reference : https://jaimemin.tistory.com/1823


server에서 client로 data를 전달하는 3가지 방법

  1. 정적리소스 전달
    웹 app에서 변하지 않는 파일들을 의미한다.
    예) HTML, CSS, JavaScript, 이미지 파일 등이 정적 리소스다.
  1. View Templete
  2. HTTP Message Body
  • 응답 데이터를 직접 Message Body에 담아 반환
    (Spring MVC 구조에서 View Resolver와 View가 동작하지 않고, 데이터를 JSON이나 XML 같은 형태로 그대로 응답해주는 것이다)

profile
정진, "어제보다 더 나은 오늘이 되자"

0개의 댓글