전체 글 98

[JPA] QueryDSL에서 Sorting(정렬)하는 Util 메서드 만들기

QueryDSL에서는 Pageable의 sort를 그대로 사용할 수 없어서 OrderSpecifier를 사용해 구현했다.orderBy()의 파라미터 타입이 OrderSpecifier이기 때문이다. OrderSpecifier의 생성자는 다음과 같이 Order와 Expression 타입의 객체를 받는다.@Immutablepublic class OrderSpecifier implements Serializable { private static final long serialVersionUID = 3427652988262514678L; private final Order order; private final Expression target; private final NullHandling ..

JPA 2024.06.24

Controller / Service / Repository의 역할

Controller역할사용자 인터페이스와 상호작용사용자의 요청을 처리하고 그에 맞는 응답을 반환주요 기능클라이언트로부터 HTTP 요청을 수신해당 요청에 대한 비즈니스 로직을 수행하기 위해 Service 계층에 작업 위임header의 정보 확인 및 Service에 필요한 데이터 전달Controller에서 하지 말아야 할 것비즈니스 로직을 Controller에 추가DB를 controller에서 조작Controller에서 Controller를 호출Service역할비즈니스 로직 처리해당 로직을 수행하기 위한 서비스 메서드 제공주요 기능하나의 비즈니스 기능이나 기능 집합 담당입력된 데이터의 유효성을 검토비즈니스 로직 수행 및 데이터를 가공Repository로부터 데이터를 가져와 비즈니스 로직 실행 또는 업데이트T..

카테고리 없음 2024.06.24

[AWS] Elastic Compute Cloud

AWS Billing Dashboard는 Root User만 접근이 가능하다.IAM User가 Billing Dashboard에 접근하고 싶다면 Root User가 권한을 주어야 한다. Budgets: 예산을 초과하는 경우 알림을 보내주는 설정 Budgets 설정[Create a budget]Budget setup: Use a template(simplified) 선택Templates - new: Monthly cost budgetZero spend budget: 프리티어 한도 초과(0.01 달러 이상 지출 발생 시 알림)Monthly cost budget: 월 예산 금액 초과 또는 초과가 예상되는 경우(예산의 85%, 100%, 100%가 예상되는 경우 알림)Budget name 설정Enter your..

AWS 2024.06.24

[Spring Boot] Scheduler로 Soft Delete 데이터 삭제

Todo 프로젝트에서 Soft Delete를 적용해 논리적으로 데이터가 삭제된 것처럼 구현하였다.실제 데이터가 삭제된 것은 아니기 때문에 불필요한 데이터가 계속 쌓이게 된다.불필요한 데이터를 계속 저장해 둘 필요는 없기 때문에 주기적으로 삭제 처리된 데이터를 지우려고 한다.이런 경우 Spring Scheduler를 사용하면 정해진 시간마다 삭제 작업을 처리할 수 있다. 다음과 같이 @EnableScheduling 어노테이션을 추가한다.import org.springframework.scheduling.annotation.EnableScheduling@EnableScheduling // 스케줄링 활성화@SpringBootApplicationclass TodolistApplicationfun main(arg..

Spring Boot 2024.06.21

[Spring Boot] Soft Delete 적용

Soft Delete논리적 삭제(물리적인 데이터는 DB에 그대로 유지)데이터 복구와 이력 추적 등에 용이실수로 삭제한 데이터를 복원해야 하는 경우데이터가 유지되어야 하는 경우Hard Delete물리적 삭제(실제로 DB에서 데이터를 삭제)Hard Delete & Soft Delete 쿼리문-- 물리적 삭제(실제 DB에서 삭제)DELETE FROM todo WHERE id = ?-- 논리적 삭제(삭제 여부를 나타내는 컬럼 사용)UPDATE todo SET is_deleted = true WHERE id = ? Soft Delete를 적용하기 위해 Entity 클래스에 어노테이션을 다음과 같이 추가한다.@Entity@SQLRestriction("is_deleted = false") // org.hibernat..

Spring Boot 2024.06.20

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..

[AWS] Identity and Access Management

User 및 Group 생성IAM로 이동 후 좌측 탭의 [Users] → [Add users] Step 1 Specify user detailsUser name 설정Provide user access to the AWS Management Console을 체크I want to create an IAM user 체크Custom password 설정Users must create a new password at next sign-in (recommended) 체크 해제[Next]Provide user access to the AWS Management Console체크하지 않으면 API를 이용해서 Access 하는 것만 가능체크를 하면 Web에서 접근을 할 수 있는 계정을 만듦 Users must creat..

AWS 2024.06.18

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..