전체 글 67

[Spring] HTTP 201 CREATED 상태 코드와 Location 헤더

201 CREATED 는 "POST" 요청 등 서버에 새로운 리소스를 생성했을 때 사용하는 HTTP 상태 코드이다. 즉, 단순히 "요청이 성공했다." 라는 의미가 아니라, "서버에서 새로운 리소스가 생성되었다" 라는 의미를 명확히 전달하는 HTTP 상태 코드이다. 해당 응답에는 생성된 리소스의 URI를 알려주기 위해서 Location 헤더를 사용하는 것이 HTTP 표준에서 강하게 권장된다.더보기관련 표준[RFC 7231 - 6.3.2. 201 Created] RFC 7231: Hypertext Transfer Protocol (HTTP/1.1): Semantics and ContentThe Hypertext Transfer Protocol (HTTP) is a stateless \%application-..

Dev/Spring 2025.06.16

[Spring] GET Method에 RequestBody 요청 적합한가?

HTTP 메서드 중 GET 메서드에서는 보통 URL 쿼리 파라미터를 통해 데이터를 전달한다.POST와 PUT 같은 메서드는 RequestBody 를 활용하는 것과는 차이가 있다. 왜 그런걸까? GET 메서드에 RequestBody를 포함하는 것은 HTTP 표준에 맞지 않는다.이에 관련된 관련 문서들을 찾아본 결과 다음과 같다. RFC 7231 문서에서는 GET 요청 메시지 내 Payload(Body)에 대해 정의된 의미가 없음을 명시하고 있다.이 말은 즉, 정의된 의미가 없기 때문에 서버에서 무시한다는 의미로 해석할 수 있다.이러한 설계는 GET의 목적이 URL 및 쿼리 매개변수를 통해 리소스를 검색하는 것이지 POST와 달리 데이터를 제출하는 것이 아니기 때문더보기(출처: RFC 7231- HTTP/1..

Dev/Spring 2025.06.16

[Project] 주특기 심화 - 트러블 슈팅

1. N+1 문제 발생 시키고자 하는 테스트 코드로 해당 문제가 발생하지 않는 문제 (해결 X)발생 상황프로젝트 레벨 2 가 N+1 문제 해결을 위한 리팩토링 문제인데,프로젝트 요구사항은 아니지만 N+1 문제에 대해 직접적으로 확인하여 이해하고자 테스트 코드를 구현 시도테스트를 위한 기본 세팅// 테스트 세팅@Autowiredprivate TodoRepository todoRepository;@Autowiredprivate UserRepository userRepository;@AutowiredEntityManagerFactory emf;@BeforeEachvoid setUp() { // User, Todo 5개 생성 for (int i=1; iN+1 문제 발생 시키기 위한 테스트 코드기대 결..

Sparta/Projects 2025.06.12

[Project] CRUD 코드 개선

Q1) 관리자 권한 없을 시 예외 처리 > Http 상태 코드 및 응답 데이터 관련1. 문제 인터셉터 구현 이후 관리자 권한이 없을 경우 예외 발생 시 400 Bad Request 로 반환메시지도 조금 더 명확하게 확인이 되었으면 함2. 해결 방안기존 코드와 같이 권한 문제로 접근이 불가능할 경우 Http 상태 코드로는 403 Forbidden이 알맞다고 판단3. 해결 완료AccessDeniedException 에 대한 예외 처리를 403 Forbidden으로 반환하도록 GlobalExceptionHandler에 코드 추가(추가1) 예외 처리에 대한 응답 DTO(ExceptionDto) 생성(추가2) 에러 코드/메시지 관리를 위해 ErrorCode Enum 생성// GlobalExceptionHandle..

Sparta/Projects 2025.06.12

[Spring] JWT(JSON Web Token)

JWT와 Token을 사용한 로그인 방식은 서버에 세션을 저장하지 않고 클라이언트측에서 인증 정보를 저장하는 방식이다.주로 스케일링, 분산 시스템에서 많이 사용된다.서버에 Session을 저장하지 않는다 → 여러 서버 간에 인증 상태를 공유하는 데 유리하다.JWT (JSON Web Token)헤더(Header), 페이로드(Payload), 서명(Signature)으로 구성된 자체 포함된 인증 토큰이다.헤더(Header)JWT 타입과 서명에 사용된 알고리즘을 지정한다.{ "alg": "HS256", // 알고리즘 (HMAC SHA-256) "typ": "JWT"}페이로드(Payload)사용자 정보, 권한, 토큰의 만료 시간 등 클레임이 포함된다.등록된 클레임: iss(발행자), exp(만료 시..

Dev/Spring 2025.05.29

[Spring] Session & Cookie (로그인 인증)

Session(세션)과 Cookie(쿠키)는 웹 개발, 인증(로그인) 기능 구현에 필수 개념으로 알고 있다. 최근 프로젝트를 진행하면서 로그인 인증을 구현할 때 세션과 쿠키를 활용하여 구현했었는데, 조금 더 정확히 이해할 필요가 있겠다.Cookie클라이언트에 저장되는 데이터 조각Key-Value 형태로 저장되고, 클라이언트가 서버에 요청할 때마다 자동으로 전송된다.사용자 추적, 세션 ID 전달, 자동 로그인 정보 저장 등에 활용된다.그 외에도 장바구니나 마지막 방문 페이지 등 다양한 기능에 사용된다.단, 보안에 취약하기 때문에 토큰 방식(JWT 등)을 사용하거나 쿠키 값 자체를 암호할 필요가 있다.유효 기간을 설정할 수 있다 → 일시적 / 지속적인 저장 가능하다.GET /home HTTP/1.1 Hos..

Dev/Spring 2025.05.26

[Project] 일정 관리 앱 Develop 하기 (with JPA)

일정 관리 앱(Scheduler App) Develop 하기JPA를 활용하여 CRUD 기능이 구현된 일정 관리 앱 만들기 일정 관리 앱 요구 사항더보기일정에 포함되어야 할 테이터작성 유저명(username)할 일 제목(title)할 일 내용(contents)작성일(createdAt )수정일(modifiedAt)유저에 포함되어야 할 데이터작성 유저명(name)이메일(email)작성일(createdAt)수정일(modifiedAt)(LV3 이후) 비밀번호(password)요구사항일정 유저 연관 관계 구현 (유저 고유 식별자 필드를 가진다)작성일 & 수정일은 JPA Auditing을 활용한다.통신 데이터 형태 (request / response)는 JSON 형태 이다.API 명세서더보기HTTP API 설계대부..

Sparta/Projects 2025.05.26

[Spring] Servlet Filter

Servlet Filter요청(Request) 과 응답(Response) 을 처리하는 중간 필터 역할하는 객체이다. Servlet 컨테이너에 의해 요청이 Servlet에 도달하기 전,혹은 Servlet이 응답을 클라이언트에 전달하기 전에 특정 작업을 수행하도록 해준다.목적요청 전 처리: 필터는 Servlet이 요청을 처리하기전에 실행된다.로그 기록, 인증, 권한 검사 등을 할 수 있다.응답 후 처리: 필터는 Servlet이 응답을 처리한 후 클라이언트에게 응답을 보내기 전에 실행된다.,응답 수정, 압축, 보안 헤더 추가 등을 할 수 있다.주요 메서드doFilter(): 필터의 주요 동작을 처리하는 메서드. 아래와 같은 내용을 처리할 수 있다.요청과 응답 변경필터는 doFilter() 메서드에서 요청(Re..

Dev/Spring 2025.05.22

[Spring] 연관 관계 매핑

지난 프로젝트를 JDBC로 구현할 때 가장 힘들어했던 부분이 Entity끼리 관계를 맺는 부분이었던 것 같다. schedules 테이블(기존)에서 작성자명을 분리해서 별도의 작성자 테이블(authors)로 관리를 하고, 이 두 테이블을 이어주기 위해서 schedules 테이블에 author_id를 추가하면서 외래 키로 설정, 그리고 authors 테이블에 id 컬럼을 생성 후 Primary Key로 설정하여 이 두 테이블을 연결하는 매개체로 하였다. 물론 말로는 쉽고 SQL만 생각해봤을 때는 단순 JOIN 영역이기 때문에 어렵지는 않았지만 여기에 Java, JDBC로 구현하려니까 여간 복잡하고 헷갈려서 힘들었던 것 같다. 이런 식으로 JDBC에서 연관 관계 표현을 코드로 구현할 수 있다. 다만, JDBC..

Dev/Spring 2025.05.19

[Spring] JPA

지난 JDBC를 이용하여 프로젝트를 진행하면서 기존 Spring Boot에 직접 DB를 연결하고 테이블도 생성하며, JDBC를 활용하여 SQL 쿼리로 DB를 다루는등 개발자가 직접 많은 것을 해야되었다.또한 이 과정에서 반복되는 코드가 너무 많기도 하고 객체 지향 설계에서도 멀어져갔다. 그래서 도입된 기술이 바로 JPA (Java Persisterce API) 이다.JPA (Java Persisterce API)Java 어플리케이션에서 객체 지향 프로그래밍 모델을 사용하여 DB와 상호작용할 수 있도록 해주는 기술이다. 객체 지향 프로그래밍에서 객체를 DB 테이블로 매핑해주는 역할객체와 DB 간의 데이터를 자동으로 변환해주는 도구대충 Java 어플리케이션에서 데이터 베이스(DB)와 상호작용 가능하도록 도와..

Dev/Spring 2025.05.15