JVM68 [Lombok] @Builder.ObtainVia 사용법과 toBuilder 개념 @Builder.ObtainVia https://projectlombok.org/features/Builder @Builder를 사용하여 여러분이 만든 클래스의 인스턴스를 생성하는 빌더를 만들 때 (이것은 메서드에 @Builder를 추가하지 않는 한 항상 해당됩니다), @Builder(toBuilder = true)를 사용하여 이 클래스 내부에 toBuilder()라는 이름의 인스턴스 메서드도 생성할 수 있습니다. 이 메서드는 현재 인스턴스의 모든 값으로 시작하는 새로운 빌더를 만듭니다. 또한 매개변수(생성자 또는 메서드의 경우)나 필드(타입에 @Builder를 사용하는 경우)에 @Builder.ObtainVia 주석을 넣어서 해당 필드/매개변수의 값을 이 인스턴스에서 가져오는 대체 수단을 나타낼 수 있.. JVM/Java 2024. 3. 21. [Java] 반복문 종류 및 특징 (for, while, do-while) 반복문 코드를 반복적으로 실행하고자 할 때 사용하는 구문 반복문 종류 : for, while, do-while for : 반복 횟수를 알고 있을 경우 주로 사용 while : 조건에 따라 반복할 때 주로 사용 for문 반복문의 대표로, 조건식이 참인 동안 주어진 횟수만큼 실행문을 반복 수행한다. 구문 for ( 초기화 ; 조건식 ; 증감식 ) { // 실행 코드 } for(int i = 0; i < 10; i ++) { System.out.println(i); } 구조 초기화 : 반복할 변수의 초기값을 설정한다 조건식 : 반복할 조건식으로 true 라면 실행문을, false 라면 실행하지 않고 반복문을 벗어난다 증감식 : 반복할 변수를 더하거나, 빼는 등의 수행 방식을 설정하여 반복 횟수를 결정한다 En.. JVM/Java 2023. 11. 7. [Spring] @Valid 와 @Validated 활용한 유효성 검증 (Feat. Custom Valid Annotation 생성) 부제 : Java Bean Validation 과 Spring Framework Validation Validation의 정확한 동작 방식을 모른채, Validation Annotation 생성하여 해결하려다 원하는 대로 동작하지 않아 결국 유효성 검증 동작 방식을 찾아보게 되었다. 관련해서 동일한 난관에 부딪혔을 때 참고하면 좋을 것 같아 남긴다. 문제 상황 동일한 클래스에 대해 제약조건이 다른 경우 필자의 경우, 하나의 클래스에서 제약조건이 다른 경우 보다는 상속 관계를 가진 부모-자식 객체에서 동일한 필드에 대한 제약조건이 다른 경우였다. 결론에 언급하겠지만, 현 게시글의 해결책은 하나의 클래스에 대해 제약조건 설정하는 경우에 더 적합하긴 하다. 요구 사항 부모 객체 name 필드는 NotNull .. JVM/Spring 2023. 10. 4. [JUnit] JUnit의 Rollback 수행 관리 @Transactional method, class 단위로 설정 가능 테스트 시작 전 트랜잭션을 시작, 테스트 완료 후 항상 롤백하여 다음 테스트에 영향을 주지 않는다. class Test { @Test @Transactional void test1() { // ... } @Test void test2() { // ... } } @Rollback (false) class 단위 @Transactional 선언한 경우, 모든 메소드에 대해 적용된다. 이 때, 특정 메소드만 rollback 처리 제외되도록 설정 가능하다 @Transactional class Test { @Test void test1() { // ... } @Test @Rollback(false) void test2() { // ... } } .. JVM/JUnit 2023. 10. 3. [JUnit] 소개 - 6. MockMVC 란 ? MockMVC 테스트 코드를 작성하지 않은 경우, 포스트맨 등의 도구를 사용해 직접 호출해 서버를 디버깅해야하는데 MockMVC를 사용하면 이 과정을 건너뛸 수 있다 쉽게 말해, 웹 애플리케이션을 애플리케이션 서버에 배포하지 않고도 스프링 MVC의 동작을 재현하여 컨트롤러를 호출해주는 클래스이다. import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest @AutoConfigureMockMvc MockMVC Method 요약 method 설명 perform 요청 전송 시 사용 .. JVM/JUnit 2023. 9. 30. [JUnit] 소개 - 5. BDDMockito 란? BDDMockito BDD (Behavior-Driven Development Mockito) : 행위 주도 개발 테스트 대상의 상태의 변화를 테스트하는 것으로, 시나리오를 기반으로 테스트하는 패턴을 권장한다. BDD 권장 패턴 : Given, When, Then Mockito 와 차이 코드로 살펴보자 Mockito Example (given, when, then) @ExtendWith(MockitoExtension.class) public class MockAnnotation { @Spy UserService userService; @Test void test() { User user = new User("heng", 29); // given when(userService.getUser()).thenR.. JVM/JUnit 2023. 9. 27. [JUnit] 소개 - 4. Mokitio 란 ? Mockito Mockito 란 ? 복잡하게 얽혀있는, 의존성을 가지는 객체들을 가짜 객체로 만들어 테스트할 수 있는데 이런 객체를 Mock 객체라고 한다. (참고) Mockito는 관리가 어려운 Mock 객체를 손쉽게 사용하도록 지원해주는 프레임워크다. Mockito 단계 Mock 객체 생성 Mock 객체 행동 (Stubbing) : when 메서드를 통해 원하는 동작을 미리 정하고 이를 기반으로 테스트한다. Mock 작동 검증 (Verify) : 호출 등이 정확히 됐는지 확인한다. Mock 생성 방식 mock Method import static org.mockito.Mockito.mock; public class MockStudy { private UserService userService; @Te.. JVM/JUnit 2023. 9. 26. [JUnit] 소개 - 3. Annotation (TestInstance, TestMethodOrder, Tag) @TestInstance 테스트 인스턴스의 라이프 사이클을 설정하는 어노테이션 명시적으로 지정되지 않은 경우 기본 값 : PER_METHOD 라이프 사이클 PER_METHOD : 각 테스트 메소드마다 인스턴스가 생성 PER_CLASS : 테스트 클래스별로 테스트 인스턴스 생성 Example (PER_METHOD) import org.junit.jupiter.api.Test class Test { int number = 0; @Test fun add1() { number++ System.out.println("[add1] number is " + number); } @Test fun add2() { number++ System.out.println("[add1] number is " + number); }.. JVM/JUnit 2023. 9. 21. Spring Boot 3.0 버전업 Swagger 변경 사항 정리 Swagger 개발한 REST API 를 문서화해주는 도구로, 사용자가 편리하게 API 테스트할 수 있는 기능 사용 방법 Spring Boot 3.0 이하 버전 build.gradle dependencies 에서 springfox-boot-starter 추가하여 사용 implementation 'io.springfox:springfox-boot-starter:3.0.0' Spring Boot 3.0 이상 버전 Spring Boot 3.x 이상 부터는 springfox가 아닌 springdoc을 사용 implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' Annotations Swagger2 (Springfox) Swagger3 (.. JVM/SpringBoot 2023. 9. 20. [JPA] N+1 발생 원인과 해결책 JPA N+1문제 1번의 쿼리를 조회하기 위해 설계하였으나, 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 문제 When . 언제 발생하는가 ? JPA Repository를 활용해 find 인터페이스 메소드를 호출할 때 발생 Who . 누가 발생시키는가 ? 1:N 또는 N:1 관계를 가진 엔티티 조회 시 발생 How . 어떻게 발생되는가 ? JPA Fetch 전략이 EAGER 전략으로 데이터 조회하는 경우 JPA Fetch 전략이 LAZY 전략으로 데이터를 가져온 이후, 연관 관계인 하위 엔티티를 다시 조회하는 경우 Why . 왜 발생하는가 ? JPA Repository find 메소드 실행 시 첫 쿼리에서 하위 엔티티까지 한 번에 가져오지 않고, 하위 엔티티를 사용할 때 추가로 조회하기 때문에 발생 .. JVM/JPA 2023. 5. 30. [JPA] QueryDSL 소개 및 프로젝트 설정하기 QueryDSL이란? QueryDSL은 하이버네이트 쿼리 언어(HQL: Hibernate Query Language)의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크이다. QueryDSL은 정적 타입을 이용하여 SQL과 같은 쿼리를 생성할 수 있게 해 준다. 자바 백엔드 기술은 Spring Boot와 Spring Data JPA를 함께 사용한다. 하지만, 복잡한 쿼리, 동적 쿼리를 구현하는 데 있어 한계가 있다. 이러한 문제점을 해결할 수 있는 것이 QueryDSL이다. QueryDSL이 등장하기 이전에는 Mybatis, JPQL, Criteria 등 문자열 형태로 쿼리문을 작성하여 컴파일 시에 오류를 발견하는 것이 불가능했다. 하지만, QueryDSL은 자바 코드로 SQL 문을 작성할 수 있어 .. JVM/JPA 2023. 5. 25. [Java] 문자열, 객체, 배열 Null Check StringUtils org.apache.commons.lang3.StringUtils 요약 Empty : Null, 공백문자("") Blank : Null, 공백문자(""), whitespace(" ") Empty StringUtils.isEmpty : Null 혹은 공백문자("") 이면 true 값 반환 StringUtils.isNotEmpty : Null 혹은 공백문자("") 이면 false 값 반환 StringUtils.isAnyEmpty : 문자들 중 Null 혹은 공백문자("") 있을 시 true 값 반환 StringUtils.isNoneEmpty : 문자들 중 Null 혹은 공백문자("") 있을 시 false 값 반환 StringUtils.isAllEmpty : 모든 문자열들이 Null 혹은.. JVM/Java 2022. 11. 18. 이전 1 2 3 4 ··· 6 다음 추천 글 728x90 반응형