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개의 댓글