2023.09.03 - [웹/Spring] - argument resolver란?

argument resolver란?

Argument Resolver는 클라이언트의 HTTP 요청을 컨트롤러 메서드의 매개변수로 매핑해주는 역할을 합니다. ex) 예를 들어, @RequestParam, @PathVariable, @RequestBody 등의 애노테이션을 사용하면 이들은 내부적

kwaksh2319.tistory.com

returnvalue handler란?
HandlerMethodReturnValueHandler 인터페이스는 Spring MVC에서 컨트롤러 메서드가 반환하는 값을 어떻게 처리할지 정의합니다. 이 인터페이스는 컨트롤러에서 반환된 객체를 HTTP 응답으로 변환하는 역할을 합니다.
 
1.supportsReturnType(MethodParameter returnType): 이 메서드는 특정 반환 유형을 처리할 수 있는지 여부를 나타냅니다. 예를 들어, 일부 ReturnValueHandler는 @ResponseBody 애노테이션이 붙은 메서드를 처리하도록 설계되어 있습니다.

2.handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest): 이 메서드는 실제 반환 값을 처리합니다.
 
ex)

@RestController
public class MyController {
  
  @GetMapping("/hello")
  public String sayHello() {
    return "Hello, World!";
  }
  
}

위 예시에서 "Hello, World!" 문자열은 HandlerMethodReturnValueHandler에 의해 HTTP 응답 본문으로 변환됩니다.
 
커스텀 ReturnValueHandler
특별한 유형의 반환 값을 처리하려면, HandlerMethodReturnValueHandler 인터페이스를 구현하여 커스텀 ReturnValueHandler를 만들 수 있습니다. 그런 다음, 이를 Spring MVC에 등록합니다.

@Configuration
public class WebConfig implements WebMvcConfigurer {
  
  @Override
  public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
    handlers.add(new MyCustomReturnValueHandler());
  }
  
}

 
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

' > Spring' 카테고리의 다른 글

url 맵핑에 관하여  (0) 2023.09.17
http 메시지 컨버트 위치?  (0) 2023.09.03
argument resolver란?  (0) 2023.09.03
HTTP 메시지 컨버터란?  (0) 2023.09.03
view Resolver란?  (0) 2023.09.03

 

Argument Resolver는 클라이언트의 HTTP 요청을 컨트롤러 메서드의 매개변수로 매핑해주는 역할을 합니다.

 

ex)

예를 들어, @RequestParam, @PathVariable, @RequestBody 등의 애노테이션을 사용하면 이들은 내부적으로 Spring MVC의 기본 Argument Resolver에 의해 처리됩니다

@RestController
public class MyController {
  
  @GetMapping("/greet")
  public String greet(@RequestParam String name) {
    return "Hello, " + name;
  }
  
}

 

HandelrMethodArgumentResolver

public interface HandlerMethodArgumentResolver {

    boolean supportsParameter(MethodParameter parameter);
    
    @Nullable
	Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
     
     }

커스텀 Argument Resolver

HandlerMethodArgumentResolver 인터페이스를 구현하여 커스텀 Argument Resolver를 만들 수 있습니다.

public class CustomUserArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(CustomUser.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        // 로직을 통해 CustomUser 객체를 생성하고 반환
        return new CustomUser("John", "Doe");
    }
}

이렇게 만든 후에는 이 Argument Resolver를 Spring MVC에 등록해야 합니다.

@Configuration
public class WebConfig implements WebMvcConfigurer {
  
  @Override
  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    resolvers.add(new CustomUserArgumentResolver());
  }
  
}

이제 컨트롤러 메서드에서 CustomUser 타입의 매개변수를 사용할 수 있고, 이 매개변수는 CustomUserArgumentResolver에 의해 처리됩니다

@RestController
public class MyController {
  
  @GetMapping("/custom")
  public String customEndpoint(CustomUser customUser) {
    return "Hello, " + customUser.getFirstName();
  }
  
}

이렇게 하면 CustomUser 객체는 CustomUserArgumentResolver를 통해 생성되고, 컨트롤러 메서드의 매개변수로 전달됩니다.

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

' > Spring' 카테고리의 다른 글

http 메시지 컨버트 위치?  (0) 2023.09.03
returnvalue handler란?  (0) 2023.09.03
HTTP 메시지 컨버터란?  (0) 2023.09.03
view Resolver란?  (0) 2023.09.03
HTTP 응답 방식  (0) 2023.09.02

 

  1. 웹 브라우저가 "localhost:8080/hello-api" 접근
  2. 서버를 거쳐 helloController 호출
  3. helloController의 @ResponseBody를 통해 HttpMessageConverter가 호출
  4. return 타입에 따라 JsonConverter 또는 StringConverter를 이용해 return

@ResponseBody의 사용

  • HTTP의 Body에 문자 내용을 직접 반환
  • viewResolver 대신 HttpMessageConverter 동작
  • 기본 문자 처리: StringHttpMessageConverter
  • 기본 객체 처리: MappingJacksonHttpMessageConverter
  • 바이트 처리 등: HttpMessageConverter가 기본으로 등록

HTTP 메시지 컨버터 인터페이스

boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);

List<MediaType> getSupportedMediaTypes();

T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
	throws IOException, HttpMessageNotReadableException;
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
	throws IOException, HttpMessageNotWritableException;

스프링 부트의 기본 메시지 컨버터

ByteArrayHttpMessageConverter
StringHttpMessageConverter
MappingJacksonHttpMessageConverter
...

기본적으로 위의 컨버터들을 지원함
대상 클래스 타입과 미디어 타입을 체크해 사용여부 결정
(만족하지 않는 경우 다음 메시지 컨버터로 우선순위 넘어감)
ex)
StringHttpMessageConverter

content-type:application/json
@RequestMapping
void hello(@Request String data){}

MappingJackson2HttpMessageConverter

content-type:application/json
@RequestMapping
void hello(@Request HelloData data){}

컨버트 실패

content-type:text/html
@RequestMapping
void hello(@Request HelloData data){}

HTTP 요청 데이터 읽기

  1. HTTP 요청이 들어오고, 컨트롤러에서 @RequestBody나 HttpEntity 파라미터 사용
  2. 메시지 컨버터가 canRead() 호출    // 읽을 수 있는 메시지인지 확인
    - 대상 클래스 타입과 HTTP의 Content-Type 미디어 타입 지원하는지
  3. canRead() 만족 시 read() 호출해 객체 생성 및 반환


HTTP 응답 데이터 생성

  • 컨트롤러에서 @ResponseBody나 HttpEntity로 값 반환
  • 메시지 컨버터가 canWrite() 호출    // 메시지를 쓸 수 있는지 확인
    - 대상 클래스 타입과 HTTP의 Accept 미디어 타입 지원하는지
  • canWrite() 만족 시 write() 호출해 HTTP 응답 메시지 바디에 데이터 생성

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

' > Spring' 카테고리의 다른 글

returnvalue handler란?  (0) 2023.09.03
argument resolver란?  (0) 2023.09.03
view Resolver란?  (0) 2023.09.03
HTTP 응답 방식  (0) 2023.09.02
@RequestBody , @ModelAttribute 파라미터 어노테이션 사용방법  (0) 2023.07.05

실행할 뷰를 찾는 일

페이지 컨트롤러가 리턴한 뷰 이름에 해당하는 뷰 컴보넌트를 찾는 역할

 

종류?

1.ResourcBundleViewResolver

 *.properties 에서 뷰이름에 해당하는 url 을 찾는다.

   ex) .properties

home.index=org.springframework.web.servlet.view.JstlView
home.index.url=/WEB-INF/jsp/home.jsp

java

@Bean
public ViewResolver resourceBundleViewResolver() {
    ResourceBundleViewResolver resolver = new ResourceBundleViewResolver();
    resolver.setBasename("views");
    resolver.setOrder(1);
    return resolver;
}

 

2.InternalResourceViewResolver

Spring Framework에서 매우 일반적으로 사용되는 뷰 리졸버(View Resolver)입니다. 이 뷰 리졸버는 논리적인 뷰 이름을 실제 JSP 또는 다른 웹 리소스 경로로 변환해주는 역할을 합니다.

ex)xml

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

java

@Bean
public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

설정에서 prefix와 suffix 속성은 뷰 이름 앞과 뒤에 추가될 문자열을 정의합니다. 예를 들어, 컨트롤러에서 "home"이라는 뷰 이름을 반환하면 InternalResourceViewResolver는 이를 /WEB-INF/views/home.jsp로 변환합니다.

 

ResourcBundleViewResolver,  InternalResourceViewResolver  차이점

뷰리졸브는 애플리케이션의 요구 사항에 따라 결정됩니다.

 

ResourceBundleViewResolver

장점

  • 설정 파일에서 명시적으로 뷰 클래스와 뷰 위치를 매핑하므로, 보다 구조화된 관리가 가능합니다.
  • 다국어(i18n) 지원 등에서 유용합니다.
  • 뷰에 대한 메타데이터를 쉽게 관리할 수 있습니다.

단점

  • .properties 파일을 따로 유지해야 하므로, 추가적인 관리 작업이 필요할 수 있습니다.
  • 각 뷰에 대한 설정이 별도로 존재하므로, 설정이 길어질 수 있습니다.


InternalResourceViewResolver

장점

  • 간단하고 빠른 설정이 가능합니다. 일반적인 경우에는 이 리졸버만으로 충분합니다.
  • 개발자가 명시적으로 매핑을 관리할 필요가 없어, 관리 부담이 적습니다

단점

  • 명시적인 뷰 매핑이 없으므로, 복잡한 뷰 로직을 처리하기 어렵습니다.
  • 다국어 지원 등의 복잡한 케이스에서는 덜 유연할 수 있습니다.


https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

' > Spring' 카테고리의 다른 글

argument resolver란?  (0) 2023.09.03
HTTP 메시지 컨버터란?  (0) 2023.09.03
HTTP 응답 방식  (0) 2023.09.02
@RequestBody , @ModelAttribute 파라미터 어노테이션 사용방법  (0) 2023.07.05
spring 구조  (0) 2023.07.03

1.정적 리소스

  EX) 웹브라우저 정적인  HTML,CSS,JS를 제공할때 정적 리소스 사용

   정적 리소스란?

    웹서버에 저장되어 변하지않는 리소스

    /static, /resource, /public 

2.뷰 템플릿

   웹 브라우져에 동적인 HTML을 제공할떄는 뷰탬플릿

   /templates/response 

3.HTTP 메시지

   HTTP API를 제공하는 경우에는 HTML이 아닌 데이터만 전달, 즉 HTTP 메세지 바디에 JSON 형식으로 데이터를 보냄

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

' > Spring' 카테고리의 다른 글

HTTP 메시지 컨버터란?  (0) 2023.09.03
view Resolver란?  (0) 2023.09.03
@RequestBody , @ModelAttribute 파라미터 어노테이션 사용방법  (0) 2023.07.05
spring 구조  (0) 2023.07.03
스프링 mvc 패턴 이해  (0) 2023.06.22

이둘은 일단 단편적으로 말해서 RequestBody는 데이터형식 json형식 데이터들을 받아올때 좋다고합니다.
ModelAttribute는 html 폼형식의 데이터를 받아올떄 사용하면 좋다고합니다. 
 
아래는 간단한 product post하는 메서드입니다.

@PostMapping("/Products/Post")
    public ResponseEntity<?> PostProducts(@RequestBody Product product,HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            // 세션에 사용자 정보가 없으면 로그인 페이지로 리다이렉트
            return ResponseEntity.badRequest().build();
        }
        productService.save(product);
        return ResponseEntity.ok().build();
    }

RequestBody Product를 받아서 했습니다.
왜냐하면 vue에서 axios는 json형식으로 데이터를 보내는게 일반적이기 때문입니다.
저도 사실 vue는 잘 모릅니다 ㅎㅎ 하지만 프론트 프레임워크를 이해한다면 어떤상황에 데이터를 받을지 알수 있겠죠!
vue:

 const config = {
        headers: {
          'Content-Type': 'application/json'
        }
      };
      try {
        this.axios.post('/Products/Post', data, config)
          .then((response) => {
            this.$router.go(0);
            this.$alert('상품', '등록 성공');
          })
          .catch((error) => {
            this.$alert('상품', '등록 실패');
          });
      } catch (error) {
        // 예외 처리
        console.error(error);
      }

 
폼형식이면 @ModelAttribute 로 Product를 파라미터로 잡아야겟죠! 

@PostMapping("/Products/Post")
    public ResponseEntity<?> PostProducts(@ModelAttribute Product product,HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            // 세션에 사용자 정보가 없으면 로그인 페이지로 리다이렉트
            return ResponseEntity.badRequest().build();
        }
        productService.save(product);
        return ResponseEntity.ok().build();
    }

아래는 html form 형식의 데이터 전송입니다.

<form action="/Products/Post" method="POST">
  <input type="text" name="name" placeholder="상품명">
  <input type="number" name="price" placeholder="가격">
  <input type="submit" value="전송">
</form>

 

' > Spring' 카테고리의 다른 글

view Resolver란?  (0) 2023.09.03
HTTP 응답 방식  (0) 2023.09.02
spring 구조  (0) 2023.07.03
스프링 mvc 패턴 이해  (0) 2023.06.22
500 error java OutOfMemoryError  (0) 2023.06.21

디자인 패턴인 mvc와 어댑터 패턴을 이용하여 현재 스프링 프레임워크가 완성됨

 

세삼 느끼는거지만 이런 아이디어를 만든 개발자들이 정말 대단하다고 느낍니다. 

출처 

https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1&unitId=71208&tab=curriculum 

 

학습 페이지

 

www.inflearn.com

 

' > Spring' 카테고리의 다른 글

HTTP 응답 방식  (0) 2023.09.02
@RequestBody , @ModelAttribute 파라미터 어노테이션 사용방법  (0) 2023.07.05
스프링 mvc 패턴 이해  (0) 2023.06.22
500 error java OutOfMemoryError  (0) 2023.06.21
http서블릿  (0) 2023.06.20

일단 spring framwork는 굉장히 추상화가 많이 되어 있는 프레임워크입니다.
많은 사람들이 반복되는 작업을 없애고 프로그램들을 손쉽게 만들어서 개발한 프레임워크입니다.
음 이번 영상 보면서 느낀점은 대략적으로는 이렇게 흘러가겠지라고 예상했던부분들을 
조금더 구체적으로 알수 있는 계기가 되었습니다.
그리고 제가 조금 잘못 알고 있는사실들도 교정하는 계기가 되었습니다.
 
사실 시간이 좀 있으면 프레임워크를 다 뜯어보고 싶은데 .. 시간이 안나오네요. 
아마 이부분부터 처음 스프링 공부하시는 분들은 멘붕일수도 있겠네요.
다양성에 대한 이해와 추상화에 대한 이해도가 낮으면 상당히 어려울수 있습니다.
저도 그랬습니다. 정말 좋은 내용의 영상인듯했습니다.
아래 이미지 출처는 영상에 두었습니다.
 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

 

' > Spring' 카테고리의 다른 글

@RequestBody , @ModelAttribute 파라미터 어노테이션 사용방법  (0) 2023.07.05
spring 구조  (0) 2023.07.03
500 error java OutOfMemoryError  (0) 2023.06.21
http서블릿  (0) 2023.06.20
Spring 프로젝트 시작하기방법  (0) 2023.06.20

+ Recent posts