Backend/Spring Boot

스프링 시큐리티를 공부하면서 몇 달 전에 프로젝트를 간단하게 했다. 인증된 사용자들끼리 웹소켓을 활용한 채팅 기능을 추가 해보고 싶어서 다시 들어갔는데 빨간색 투성이가 나를 맞이했다. 도대체 이게 왜 안되는거지 하고 찾아보다가 gradle을 다시 리로드하니까 라이브러리들이 다시 정상적으로 import 되었다. 찾아보니 windows에선 종종 겪는 현상이라고 한다. 원인은 IDE와 Gradle 간의 캐시 이슈라는데 자세히는 모르겠다.. 그냥 Gradle 다시 빌드하면 되는 문제이다. 코드를 오랜만에 다시 보니 불편한 요소들이 꽤나 있어서 리팩토링을 하였다. Spring Security 6.x 베스트 프랙티스 적용null 안정성 확보성능 최적화보안 강화유지보수성 향상관점에서 생각해봤다. UserD..
러닝 앱 백엔드를 개발하면서 JWT 토큰 발급, 카카오 OAuth, 복잡한 보안 설정을 매번 거쳐서 API를 테스트하기엔 너무 번거로웠다. 특히 @AuthUser AuthenticatedUser user 파라미터를 사용하는 Controller들을 테스트할 때마다 실제 JWT 토큰을 만들어야 하는 상황이었다. 따라서 메인 로직은 건드리지 않으면서 테스트만을 위한 postman 프로필을 만들어 Mock 인증으로 우회하는 방법을 사용했다. 겪으면서 알게 된 것들이 꽤 있으므로 공유해보겠다. 구조📁 config ├── SecurityConfig.java (메인 보안 설정 - JWT 기반) ├── SecurityConfigPostman.java (테스트용 보안 설정 - Mock 기반) ├── Web..
프로젝트 진행하면서 프론트와 같이 카카오 로그인을 진행했는데 자꾸 KOE006과 KOE303 에러가 떴다. 생각보다 어렵진 않지만 다들 한 번씩 겪는 문제 중에 나같은 케이스가 있을 거라고 생각되어 공유한다. 개발 환경Frontend: React Native (Expo)Backend: Spring Boot 3.5.4OAuth: 카카오 로그인네트워크: 학교 Wi-Fi 환경 처음부터 AWS를 활용하면서 우리 아키텍처상 EC2와 DB를 Private 서브넷에 두고, 블루/그린 배포까지 고려했기 때문에 NAT 게이트웨이 비용이 걱정됐다. 그래서 같은 와이파이 내에서 임시로 환경을 구성해 테스트했는데, 생각해보니 테스트 목적이라면 프리 티어로 퍼블릭 서브넷에 EC2를 만들고 EIP만 연결해도 충분했는데 괜히 더..
친구들을 보면 당연하게 DTO에 롬복으로 Getter Setter를 사용하길래 왜 사용하냐고 했더니 그냥 getter 사용하면 setter도 같이 쓰는게 습관이 됐다고 했다. POJO 스타일의 Java 객체 설계에선 getter와 setter가 한 쌍으로 사용되기 때문에 그렇게 생각할 수 있긴 한데 DTO에선 setter를 사용하지 않는 것이 더 좋은 설계 방법이다. 이제 알아보자. DTO의 정의와 역할 DTO는 시스템 내에서 계층 간 데이터 전송을 위해 사용되는 객체이다. 일반적으로 서비스 계층과 프론트엔드 또는 컨트롤러 간에 데이터를 전달할 때 사용된다, DTO는 복잡한 비즈니스 로직을 처리하지 않고 단순히 데이터를 담고 전달하는 전송용 객체이다. 예를 들어 사용자 정보를 다룰 때 User..
Spring에서 API 예외 처리는 일반 웹 페이지 예외 처리와는 다른 접근이 필요하다. API는 오류 발생시 JSON 형태로 적절한 오류 응답을 제공해야 하기 때문이다. Spring에선 @ExceptionHandler와 @ControllerAdvice를 사용해서 이 문제를 해결한다. @ExceptionHandler의 필요성 HTML과 API 오류 처리의 차이를 생각해보자. HTML 페이지는 단순히 오류 페이지(4XX, 5XX)를 보여주면 된다. 반면에 API는 각 오류 상황에 맞는 JSON 응답과 HTTP 상태 코드를 제공해야 한다. 기존 예외 처리 방식인 BasicErrorController는 HTML 오류 페이지 중심으로 동작하고 API처럼 예외마다 다른 JSON 응답 포맷이 필요한 경우에는 유..
Spring MVC에서 컨트롤러에 쿼리 파라미터를 받기 위해 @RequestParam을 사용할 때 어떤 상황에서는 명백히 올바른 파라미터를 전달했음에도 서버가 400 Bad Request를 응답하는 경우가 있다. 최근 내가 겪었던 상황이 그랬다. 단순히 @RequestParam Integer data 하나 받는 API였고 Postman으로 ?data=10이라는 정수 파라미터를 넣었는데도 400 오류가 발생했다. 파라미터 누락이나 형식 오류라고 생각했는데 로그를 보니 java.lang.IllegalArgumentException이 발생하고 있었고 stack trace에서 핵심 메시지를 보니 이렇게 쓰여있었다. Name for argument of type [java.lang.Integer] not sp..
요즘 jwt를 공부중인데 그 전에 쿠키와 세션에 대해 어느 정도 체계를 잡고 넘어가고 싶어서 정리한다. 웹은 왜 기억을 못할까? 우리가 웹 사이트를 방문하면 거기서 다양한 활동들을 한다. 로그인을 하거나 장바구니에 상품을 담거나 하면서 로그인 되어있는 상태에서 각 활동을 수행한다. 근데 사실 웹 자체는 이런 걸 기억하지 못한다. 왜냐하면 웹 통신의 기본 프로토콜인 HTTP는 Stateless(무상태) 프로토콜이기 때문이다. 무상태란? -> 서버는 요청이 올 때마다 누군지, 뭘 했는지에 대한 기억이 없이 새로 처리한다는 의미이다.매번 처음 보는 손님처럼 대한다고 생각하면 된다. 쿼리 파라미터를 계속 유지하면서 보내는 건 어렵고 번거로운 작업이기 때문에 쿠키와 세션을 사용하는 것이 좋다. 쿠키 쿠키는..
HTTP 응답 메시지에 데이터를 어떻게 담아서 보낼까? 크게 나누면 두 가지 방식이 있다. 1. 문자열(String)을 응답으로 보내기 2. JSON 형태의 객체 응답(HelloData) 어떻게 점점 간결하고 편리한 방식으로 발전했는지 확인해보자. 코드는 김영한 선생님의 mvc패턴 강의자료에서 가져왔다.   V1: 서블릿 HttpServletResponse 직접 사용 @GetMapping("/response-body-string-v1")public void responseBodyV1(HttpServletResponse response) throws IOException { response.getWriter().write("ok");} 자바 웹 개발의 전통적인 서블릿 API 방식이다.HttpServl..
hskhsmm
'Backend/Spring Boot' 카테고리의 글 목록