TIL(Today I Learned) 53

TIL - Spring Boot Test 시 JPA metamodel must not be empty

Entity 클래스들에 공통으로 적용되는 BaseTimeEntity 클래스를 생성하면서 Application 클래스에 @EnableJpaAuditing 어노테이션을 적용했다.서버를 실행 후 PostMan으로 데이터 등록 요청 테스트를 하면 DB에 정상적으로 데이터가 삽입되는 것을 확인할 수 있었다.그런데 테스트 코드에서는 다음과 같은 메시지가 출력되면서 테스트를 할 수 없었다.Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting..

TIL - AWS Elastic Beanstalk 배포 후 413 Request Entity Too Large

위와 같은 문제가 발생하는 이유는 Elastic Beanstalk를 이용해 배포할 경우 프록시 서버로 사용되는 Nginx의 client_max_body_size 설정이 1MB로 되어 있기 때문이다. client_max_body_size: request의 Content_Length 헤더 값이 지정된 용량을 넘지 않도록 설정(악의적인 대용량 파일 업로드를 방지) client_max_body_size를 설정하는 방법은 2가지이다.EC2 Instance Connect로 접속해 직접 값을 설정배포 파일(.zip)에 포함EC2 Instance Connect로 접속해 설정하기인스턴스 선택 → [Connect] → EC2 Instance Connect → [Connect]vi /etc/nginx/nginx.conf 위..

Docker 명령어 1

Docker컨테이너 기술: 컨테이너를 생성하고 관리하기 위한 도구컨테이너의 생성 및 관리 프로세스를 단순화하는 도구라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함된 패키지이미지: 읽기/쓰기 액세스 권한이 있는 인스턴스를 실행하는 컨테이너의 “블루프린트”컨테이너이미지의 실행 인스턴스이미지를 기반으로 하는 실행 애플리케이션(격리된 소프트웨어 유닛)일단 실행되면 실행 중인 다른 컨테이너와는 독립적인 스탠드얼론여러 컨테이너가 동일한 이미지를 기반으로 할 수 있지만, 서로 완전히 격리되어 있음디폴트로 공유 데이터나 상태가 없음레이어이미지의 내부 내용(context)에서의 레이어이미지의 모든 명령은 캐시 가능한 레이어를 생성이미지 재구축 및 공유를 도움Docker를 사용..

Windows에서 Docker 설치

Docker를 사용하는 이유애플리케이션 개발 및 배포가 편해짐Docker Container 내부에서 여러 소프트웨어를 설치해도 호스트 OS에는 영향이 없음CI/CD에서 지속적인 통합(Continuous Intergration) 과정의 테스트에서 Docker를 활용어떤 서버를 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포를 구성할 수 있음여러 애플리케이션의 독립성과 확장성이 높아짐Docker가 가상화에서 사실상 표준의 위치Docker 및 Docker Compose 설치(Windows)💡windows의 경우 WSL2 설치가 필요WSL2 설치를 위한 사전 준비[시작] → [제어판] → [프로그램 및 기능] → [Windows 기능 켜기/끄기] → [Hyper-V]와 [Linux용 ..

TIL - Entity의 Setter 사용을 지양하기

Todo 프로젝트에서 Entity 클래스의 프로퍼티들을 다음과 같이 설정하였다.수정이 가능한 프로퍼티에 대해서는 var로 선언수정이 될 일이 없는 프로퍼티들은 val로 선언Todo Entity에서 title, content, writer, completed는 수정 요청 시 변경되는 값이다.@Entity@Table(name = "todo")class Todo private constructor( var title: String, var content: String, var writer: String, // ... ) : BaseEntity() { // ... @Enumerated(EnumType.STRING) var completed: TodoComplet..

TIL - SecurityContextHolder에서 인증 객체 가져오기

최근 프로젝트에서 JWT 토큰의 정보를 인증 객체에 저장 후 사용할 때 다음과 같이 SecurityContextHolder에서 인증 객체를 직접 가져오는 코드를 사용했었다.fun getUserDetails(): CustomUserDetails { val principal = SecurityContextHolder.getContext().authentication.principal return if (principal is CustomUserDetails) principal else null} 물론 직접 가져오는 방법 외 다음과 같이 메서드에 @AuthenticationPrincipal 어노테이션을 사용해 인증 객체를 가져오는 방법도 있다.@PutMapping("/{todoId}")fun upd..

TIL - Spring Boot에서 Filter 내 발생하는 Exception 처리

백오피스 프로젝트에서 JWT 토큰을 사용해 인증 처리 후 SecurityContext에 담기는 사용자 정보를 추출해 다른 Service 클래스에서 사용할 수 있도록 메서드를 작성했다.그런데 이 코드는 JWT 토큰이 없는 상태에서 principal에 anonymousUser가 들어가기 때문에 UserPrincipal로 타입 캐스팅을 할 수 없다는 예외가 발생했다.fun getMemberIdFromToken(): Long? { val principal = SecurityContextHolder.getContext().authentication.principal as UserPrincipal return principal.id} 이 문제를 해결하기 위해 JwtAuthenticationFilter 클..

TIL - 비밀번호 수정 요청 시 기존 비밀번호를 사용하지 못하게 하기

백오피스 프로젝트에서 1차 기능 구현에서 회원 관리를 담당하게 되었다.요구사항 중 최근 3번 안에 사용한 비밀번호는 사용하지 못하도록 하는 조건이 있었다.3번이라는 확정된 조건이 있어서 DB 테이블에 변경이력 1, 2, 3처럼 만드는 방법도 있지만 한 컬럼 안에서 해결할 수 있는 방법이 있어서 기록으로 남겨본다. 회원정보 수정에 대한 전체 코드는 다음과 같고 수정할 수 있는 회원정보는 이름, 전화번호, 비밀번호이다. @Transactional fun updateMember( updateMemberRequest: UpdateMemberRequest ): MemberResponse { val memberId = getMemberIdFromToken() v..

TIL - Spring Security Filter

Spring Security 의존성을 추가하고 프로젝트를 실행하면 다음과 같이 여러 Filter들이 실행되는 것을 볼 수 있다.Will secure any request with [ org.springframework.security.web.session.DisableEncodeUrlFilter@36776c32, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7792d851, org.springframework.security.web.context.SecurityContextHolderFilter@2291d9a0, org.springframework.security.w..

TIL - Spring Security

Spring Security인증 , 권한 부여 및 일반적인 공격에 대한 보호를 제공하는 프레임워크인증(Authentication) : 사용자가 누구인지 확인하는 과정권한 부여(Authorization) : 인증된 사용자가 특정 자원에 접근할 수 있는지 결정하는 과정세션 관리(Session Management) : 사용자 세션을 관리하고, 동시 로그인을 제한할 수 있음CORS(Cross-Origin Resource Sharing) : 다른 도메인의 리소스를 안전하게 요청할 수 있도록 하는 매커니즘JWT(JSON Web Token) : 사용자의 인증 정보를 JSON 형식으로 표현한 토큰을 사용하여 상태를 유지하지 않는 인증방식을 제공Spring Security 인증 프로세스인증 필터가 요청을 가로챈다.인증 ..