💻dev/🌱Java+Spring

RESTful API를 만들 때 단건의 값을 반환하는 것이 아니라 여러 개의 값들을 반환할 상황이 있다. 이번 프로젝트의 경우 여러번 그런 상황이 있었는데 Spring으로 처음 프로젝트를 진행해보고, 특히, Page를 사용해서 반환하기 때문에 처음에는 약간 막막했다. DTO와 Builder 패턴을 사용하여 어떻게 List로 반환하는 지 자세한 예시를 통해 알아보도록 하자. ReviewController @RestController @RequiredArgsConstructor @RequestMapping("/reviews") public class ReviewController { private final ReviewService reviewService; @Operation(summary = "나의 리뷰..
Spring Security가 뭔데? Spring Security는 Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크. 인증(Authentication): 해당 사용자가 본인이 맞는지를 확인하는 절차 인가(Authorization): 인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차 Spring Security는 기본적으로 인증 절차를 거친 후에 인가 절차를 진행하게 되며, 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지 확인을 하게 된다. Spring Security에서는 이러한 인증과 인가를 위해 Principal을 아이디로, Credential을 비밀번호로 사용하는 Credential 기반의 인증 방식을 사용한다. Principal(접..
@NoArgsConstructor와 @AllArgsConstructor은 생성자 코드를 더 간결하게 작성할 수 있는 강력한 도구입니다. 이 어노테이션들은 주요 필드들을 자동으로 초기화하거나, 특정 상황에서 기본 생성자를 자동으로 생성해주므로, 불필요한 반복 작업을 줄이고 코드 유지 보수성을 향상시킬 수 있습니다. @NoArgsConstructor란? @NoArgsConstructor는 클래스에 파라미터가 없는 기본 생성자를 자동으로 생성해줍니다. 이는 주로 JPA 엔티티 클래스와 같이 파라미터 없는 기본 생성자가 필요한 경우에 유용합니다. 일반적으로 기본 생성자에 대한 접근 제어를 위해 @NoArgsConstructor(access=AccessLevel.PROTECTED)와 같이 사용합니다. 무분별하게 ..
@Builder로 객체를 안전하게 생성하기 Lombok은 수많은 어노테이션을 지원한다. Builder 어노테이션을 이용해서 엔티티 객체를 Builder 패턴으로 생성해준다. 이 패턴을 알아보고 안전하게 객체를 생성하는 방법을 소개한다. Builder 패턴의 장점은 다음과 같다. 다양한 빌더를 구현하여 다양한 종류의 유연성 있는 객체 생성 가능 빌더를 사용하여 객체를 생성하면 코드의 가독성이 향상 예시) Member 엔티티를 @Builder로 생성 @Builder @Entity @Getter public class Member{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; pr..
Optional을 사용하게 된 계기 바야흐로 프로젝트에서 Repository 개발 단계였다. 기존 엔티티 단건 조회는 단순하게 엔티티로 반환하고 있었고, 담당한 UserRepository를 테스트하다가 NPE를 만나게 된다. NPE(Null Pointer Exception) 개발자들이 가장 많이 마주치는 에러가 아닐까 싶다. (만나기. 싫어요. 제발). NPE는 Null 반환 자체도 문제지만 추적할 수 없어 오류 핸들링이 더 어렵다는 극악무도한 점이 있다. 아무튼 내 케이스에서 원인은 없는 User 엔티티를 반환하려다 보니 발생한 에러였고, 이를 좀 더 쾌적하게 핸들링 하기 위해 Optional을 처음 사용하게 되었다. 기존 다른 코드에도 엔티티 단건 조회는 전부 엔티티를 반환하고 있었기에 이를 계기로 ..
동적 쿼리와 성능 최적화 조회 Builder 사용 MemberTeamDto - 조회 최적화용 DTO 추가 @QueryProjection public MemberTeamDto(Long memberId, String username, int age, Long teamId, String teamName) { this.memberId = memberId; this.username = username; this.age = age; this.teamId = teamId; this.teamName = teamName; } @QueryProjection 을 추가 - QMemberTeamDto 를 생성하기 위해 ./gradlew compileQuerydsl 을 한번 실행 회원 검색 조건 @Data public class..
수정, 삭제 벌크 연산 벌크 연산 사용 후에는 영속성 컨텍스트를 초기화 시켜주는 게 좋다. 설명은 아래 주석 참고 쿼리 한번으로 대량 데이터 수정 가능 @Test public void bulkUpdate() { /** * member1 = 10 -> DB member1 * member2 = 20 -> DB member2 * member3 = 30 -> DB member3 * member4 = 40 -> DB member4 * */ long count = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); /** * member1 = 10 -> DB 비회원 * member2 = 20 ->..
동적 쿼리를 해결하는 두가지 방식 BooleanBuilder Where 다중 파라미터 사용 BooleanBuilder 초기값을 지정 할 수도 있음 @Test public void dynamicQuery_BooleanBuilder() throws Exception { String usernameParam = "member1"; Integer ageParam = 10; List result = searchMember1(usernameParam, ageParam); Assertions.assertThat(result.size()).isEqualTo(1); } private List searchMember1(String usernameCond, Integer ageCond) { BooleanBuilder bui..
쁜새
'💻dev/🌱Java+Spring' 카테고리의 글 목록 (2 Page)