분류 전체보기298 [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. [MyBatis] 동적 쿼리 <trim> 사용 방법 trim 속성 속성 설명 prefix 실행될 구문 쿼리 가장 앞에 붙여준다 prefixOverrides 실행될 구문 쿼리 가장 앞에, 해당하는 문자들이 있는 경우 자동으로 지워준다 suffix 실행될 구문 쿼리 가장 뒤에 붙여준다 suffixOverrides 실행될 구문 쿼리 가장 뒤에, 해당하는 문자들이 있는 경우 자동으로 지워준다 trim 문법 SELECT * FROM user WHERE id = #{id} OR user_name = #{userName} OR user_email = #{userEmail} 설명 prefix : 구문 맨 앞에 AND ( 가 붙음 prefixOverrides : trim 구문 안의 맨 처음 OR 로 시작할 경우 제거 suffix : 구문 맨 뒤에 ) 가 붙음 실행 쿼리 .. Database/MyBatis 2023. 9. 12. 티스토리 블로그 광고 쿠팡 파트너스 사용하기 블로그 광고에 주로 많이 사용되는 광고 플랫폼 구글 애드센스 카카오 애드핏 쿠팡 파트너스 블로그 광고 종류 CPM (Cost Per Mile) 방문자가 글을 읽다가 광고를 보는 것만으로 수익이 들어옴 주로 노출 1,000 회당 수익 발생 단가가 낮아 일일 방문자가 만 단위 이하라면 효과가 많이 낮음 CPC (Cost Per Click) 방문자가 글에 있는 광고를 클릭했을 때 수익이 발생 CPM보다 단가가 높음 평균 단가 100원 ~ 1,000원 구글 애드센스, 카카오 애드핏, ... CPA (Cost Per Action) 제휴 마케팅이라고도 부르며 광고주가 원하는 행위에 따라 수익이 들어오는 광고 서비스 가입이나 홍보한 상품이 판매되었을 때 정해진 커미션을 받는 광고 평균 단가 500원 ~ 100,000.. 기타 2023. 6. 14. [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. [Git/GitHub] Git Merge 와 GitHub Merge Git / GitHub 의 Merge 종류 Git Merge 종류 Merge Squash and Merge Rebase and Merge 앞으로 모든 예시에는 기준 브랜치 master로, master 브랜치를 base로 분기된 브랜치를 feature 브랜치라고 부르겠다. 모든 테스트는 feature 에서 master 로 merge하는 과정을 예시로 들겠다. Merge 상황에 따라 Fast-forward Merge, Recursive Merge로 동작한다. # current merge = master git merge Fast-forward Merge master 와 feature 형상이 동일한 상태인 경우 feature branch에 추가된 commit이 master branch에 그대로 붙게되며, 병합.. SCM/Git + Github 2023. 5. 17. 이전 1 2 3 4 5 ··· 25 다음 추천 글 728x90 반응형