반응형 SpringBoot46 @ModelAttribute, @RequestBody의 차이점 @ModelAttribute와 @RequestBody 어노테이션은 Spring MVC 프레임워크에서 사용됩니다. HTTP 요청의 데이터를 컨트롤러 메서드에서 처리하기 위해서 사용됩니다. 위의 예시 코드를 활용해서 2개의 어노테이션의 사용 방법과 동작에 대해 알아보겠습니다. 코드 분석 @RequestBody RequestBody는 HTTP 요청의 본문(body)에 담긴 데이터를 객체로 바인딩하기 위해 사용됩니다. 컨트롤러 메서드의 파라미터 앞에 @RequestBody를 사용하여 해당 파라미터의 요청 본문의 데이터를 변환하여 객체로 받아올 수 있습니다. 주로 JSON, XML 등의 데이터 형식의 요청을 처리할 때 사용됩니다. @PostMapping("/test") public ResponseEntity te.. Spring/스프링 이론 2024. 2. 4. STOMP와 RabbitMQ를 이용한 채팅 서비스 이전 포스팅에서 STOMP를 이용한 채팅서비스를 개발했었다. https://miiro-under.tistory.com/273 Stomp를 활용한 웹소켓 구현 서론 Stomp를 이용하여 웹소켓을 구현하는 방법에 대해 알아보겠습니다. 이전 포스팅에서 Stomp에 관한 개념에 대해 설명했었습니다. https://miiro-under.tistory.com/272 Message Broker STOMP 개념 서론 Message를 miiro-under.tistory.com 여기서 간단히 정리를 하자면 STOMP 는 publish/subscribe(발행/구독) 구조로 간단하게 메시지를 선택해서 수신을 할 수 있다. 기본적으로 스프링에서는 내장 브로커를 제공하지만, 여러 문제점이 있다. 1. In Memory 형식으로 .. Spring/Issue 2024. 1. 30. Stomp를 활용한 웹소켓 구현 서론 Stomp를 이용하여 웹소켓을 구현하는 방법에 대해 알아보겠습니다. 이전 포스팅에서 Stomp에 관한 개념에 대해 설명했었습니다. https://miiro-under.tistory.com/272 Message Broker STOMP 개념 서론 Message를 송-수신할 때 사용하는 MessageBroker 중 STOMP 프로토콜에 대해 알아보겠습니다. STOMP란? Simple Text Oriented Messaging Protocol 의 약자로써, WebSocket의 서브 프로토콜 입니다. 웹소켓은 Text와 Bina miiro-under.tistory.com Stomp를 이용해서 간단하게 채팅 서비스를 구현해보겠습니다. 코드 구현 의존성(build.gradle) dependencies { //w.. Spring/Issue 2024. 1. 24. Message Broker STOMP 개념 서론 Message를 송-수신할 때 사용하는 MessageBroker 중 STOMP 프로토콜에 대해 알아보겠습니다. STOMP란? Simple Text Oriented Messaging Protocol 의 약자로써, WebSocket의 서브 프로토콜 입니다. 웹소켓은 Text와 Binary 형식의 타입을 정하긴 하지만, 어떠한 규격도 정해져있지 않습니다. 하지만 STOMP의 경우에는 다음과 같은 형식을 따라갑니다. COMMAND header1:value1 header2:value2 Body^@ STOMP의 커맨드 목록은 다음과 같습니다. 클라이언트 프레임 SEND SUBSCRIBE UNSUBSCRIBE BEGIN COMMIT ABORT ACK NACK DISCONNECT 서버 프레임 MESSAGE REC.. Spring/스프링 이론 2024. 1. 24. Scheduler Thread Pool 사용하기 이전 글에서 스프링에서 스케쥴링을 하는 내용을 다뤘다. https://miiro-under.tistory.com/261 레디스와 스케쥴러를 이용한 조회수 증가 Issue 이전 포스팅에서 조회수 기능을 중복 방지할 수 있도록 세션(Session)을 사용했다. https://miiro-under.tistory.com/260 조회수 기능 구현하기 - 중복 방지(Session) Issue 이전 포스팅에서 조회수 기능을 중 miiro-under.tistory.com 스케쥴링을 실행되어야 할 기능이 여러 개일 경우 사용해야할 것이 Thread Pool 이다. 위의 프로젝트에서 스케쥴러를 2개를 사용할 예정인데 예제를 이용하여 테스트를 진행해보겠습니다. 예제 코드는 해당 링크에서 확인하시면됩니다 : github 코드.. Spring/Issue 2024. 1. 8. @RequestParam을 Enum 타입으로 받기 축구 커뮤니티 프로젝트를 구현시 발생한 이슈입니다. 링크 : github 현재, Soccer 필드에는 Enum으로 관리되는 League 필드가 있습니다. 저는 League를 Request Parameter로 입력받아 Leauge에 해당하는 해당 정보들을 반환하는 GET 요청 API를 만드려고 합니다. League라는 Enum class에는 나라의 이름과 해당 나라 코드를 선언해놓은 상태입니다. 그러다보니 일일이 code나 country 를 request 요청을 하는 것보다 League enum을 변환하여 사용하고 싶다는 생각을 했습니다. 문자열과 enum의 이름이 같다면 자동으로 컨버팅해주겠지만, 그렇지 않다면 문제가 있습니다. 1. 휴먼 에러가 발생하기 쉽다. 2. 팀 프로젝트의 경우 중간에 참여한 사.. Spring/Issue 2024. 1. 7. [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/octet-stream' not supported] 에러 해결하기 DTO와 MultipartFile을 요청하는 create 로직에서 해당 에러가 났다. @RequestBody에서 @RequestPart로 어노테이션을 바꿔주고 @RequestPart(required = false) 와 함께 MultipartFile files 를 추가해준 상황이었다. 포스트맨에서는 내가 작성한 커스텀 에러가 나서 인텔리제이의 콘솔창을 확인해봤습니다. 에러 문구를 확인해보면 'Content-Type 'application/octet-stream' is not supported' 로 미디어 타입이 잘 못 되었다는 것을 확인할 수 있다. 원래는 file을 받기 전에는 포스트맨에서 raw -> Json 타입으로 데이터를 전송했었다. 하지만 file을 보내주면서 form-data 형식으로 변경해준.. Spring/Issue 2024. 1. 5. 레디스와 스케쥴러를 이용한 조회수 증가 Issue 이전 포스팅에서 조회수 기능을 중복 방지할 수 있도록 세션(Session)을 사용했다. https://miiro-under.tistory.com/260 조회수 기능 구현하기 - 중복 방지(Session) Issue 이전 포스팅에서 조회수 기능을 중복 방지할 수 있도록 세션 쿠키(Session-Cookie)를 사용했다. https://miiro-under.tistory.com/259 조회수 기능 구현하기 - 중복 방지(Cookie) Issue 커뮤니티 서비스를 구현 miiro-under.tistory.com 현재 로직의 경우 게시글을 조회할 때마다 DB에 조회수를 증가하는 카운팅을 쓰는 작업을 수행하고 있습니다. 하지만 조회수만 증가를 시키는 게 목적인데, 요청마다 테이블을 조회해서 불필요한 쿼.. Spring/Issue 2024. 1. 3. 조회수 기능 구현하기 - 중복 방지(Session) Issue 이전 포스팅에서 조회수 기능을 중복 방지할 수 있도록 세션 쿠키(Session-Cookie)를 사용했다. https://miiro-under.tistory.com/259 조회수 기능 구현하기 - 중복 방지(Cookie) Issue 커뮤니티 서비스를 구현하는 토이프로젝트를 진행하면서 게시판의 조회수를 증가 로직을 만드려고 합니다. 게시글이 조회될 때마다 조회수를 증가하는 게 가능하지만 동일 사용자에 한해 miiro-under.tistory.com 세션 쿠키는 사용자가 웹 사이트를 탐색하는 동안 생성되고 유지되며, 브라우저가 닫히면 삭제가 된다. 그런데 현재 나는 RESTful API를 구현하는 시나리오로 해당 토이프로젝트를 진행 중이다. RESTful API의 경우, 클라이언트와 서버 간 통신이.. Spring/Issue 2024. 1. 2. SpringBoot Swagger 3.x.x 적용하기 SpringBoot 3.x.x Swagger 적용 SpringBoot 버전을 3.0.0 이상 사용하는 프로젝트에서 Swagger를 도입할 때 사용해야하는 Swagger 라이브러리에 대해 알아보겠습니다. 기존 SpringBoot 3.0.0 이하 버전인 경우 이전 포스팅에서 확인하실 수 있습니다. https://miiro-under.tistory.com/209 Swagger - REST API 명세 문서화 명세 문서화 명세 : 해당 API가 어떤 로직을 수행하는지 설명하고 이 로직을 수행하기 위해 어떤 값을 요청하며 이에 따른 응답값으로는 무엇을 받을 수 있는 지 정리한 자료이다. API는 개발 과정 miiro-under.tistory.com 의존성 라이브러리 설정 SpringBoot 3.0.0 이상부터는 .. Spring/스프링 이론 2023. 12. 31. [Spring Security] @AuthenticationPrincipal 로그인 정보 받아오기 @AuthenticationPrincipal 로그인 정보 받아오기 @AuthenticationPrincipal 을 이용해서 로그인 정보를 받아오는 방법에 대해 알아보겠습니다. 기존 방식 컨트롤러 세션에 저장되어 있는 member의 아이디를 이용해서 조회하여 사용 @GetMapping("/member") public ResponseEntity findMemberInfo(@RequestParam Long id) { return ResponseEntity.ok(memberService.findMemberInfo(id)); } 해당 방식으로 사용하면서의 불합리 1. 로그인 사용자의 정보가 필요할 때마다 매번 서버에 요청해서 DB에 접근해서 데이터를 가져온다. 2. 본인이 아닌데 타인의 정보를 확인할 수 있다. .. Spring/스프링 이론 2023. 12. 23. [Mockito] @WebMvcTest 401/403 에러 처리하기 @WebMvcTest 401/403 에러 처리하기 API 개발 후 테스트를 하는 도중에 발생한 에러를 처리하는 방법에 대해 알아보겠습니다. 테스트 코드 @WebMvcTest(AuthController.class) class AuthControllerTest { @MockBean private AuthService authService; @MockBean private MailService mailService; @MockBean private TokenProvider tokenProvider; @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; @Test @DisplayName("회원가입 성공") void su.. TEST/JUnit 2023. 12. 20. 이전 1 2 3 4 다음