Java 52

Unit test (단위 테스트)와 테스트 종류

단위 테스트 위의 그림에서 알수 있듯이 단위 테스트는 가장 작은 단위인 메서드 단위로 테스트하는 것을 말한다. F.I.R.S.T 원칙 단위 테스트를 위한 테스트 케이스를 작성하기 위해 참고할 수 있는 가이드 원칙으로 F.I.R.S.T 원칙을 참고할 수 있다. Fast(빠르게) 일반적으로 작성한 테스트 케이스는 빨라야 한다. Independent(독립적으로) 각각의 테스트 케이스는 독립적이어야 한다. Repeatable(반복 가능하도록) 테스트 케이스는 어떤 환경에서도 반복해서 실행이 가능해야 된다. Self-validating(셀프 검증이 되도록) 단위 테스트는 성공 또는 실패라는 자체 검증 결과를 보여주어야 한다. Timely(시기적절하게) 단위 테스트는 테스트하려는 기능 구현을 하기 직전에 작성해야 ..

DB N+1 문제해결(JPQL의 join fetch 사용)

N+1문제란 DB에서 어떠한 데이터를 불러올때 해당 엔티티의 연관관계(N)만큼 쿼리가 추가 발생하는 문제이다. 이러한 문제를 JPQL의 join fetch를 사용하여 발생하는 쿼리의 수를 줄일수가 있다. 테스트를 위한 세팅 @Profile("n-plus-one-problem") @Configuration public class NPlusOneProblemConfig { private EntityManager em; private EntityTransaction tx; @Bean public CommandLineRunner testJpaFetchStrategyRunner(EntityManagerFactory emFactory) { this.em = emFactory.createEntityManager();..

이벤트리스너와 비동기

이벤트리스너 ApplicationEventPublisher를 이용하여 이벤트를 발생시킨뒤 @EventListener와 @TransactionalEventListener 에너테이션을 사용하여 정해진 대상과 관련된 메서드를 특정한 시점에 호출시킬수 있다. 이벤트리스너를 사용하면 정해진 조건에 맞는 이벤트만을 추적하여 관련된 메서드만을 자동으로 실행시킬수 있게 되어 따로 특정한 로직을 실행 시키기위해 다른 객체들과 의존관계를 맺지 않아도 되어 코드간의 의존성을 낮추고 더 독립적인 프로그래밍이 가능하다. 예제 코드 @Getter @Component @Slf4j public class EventHandler { // 1. @EventListener public void process(Member member){ ..

BeanWrapper를 이용하여 객체의 필드값 접근

기존코드 public Member updateMember(Member member) {// 수정시킬 필드값들을 담고있는 Member 엔티티 객체 Member findMember = findVerifiedMember(member.getMemberId());// 데이터베이스에 저장된 Member 엔티티 객체 //매개변수로 받은 객체의 필드들을 하나씩 확인하여 값이 들어있는 필드의 값들만 업데이트 Optional.ofNullable(member.getName()) .ifPresent(name -> findMember.setName(name)); Optional.ofNullable(member.getPhone()) .ifPresent(phone -> findMember.setPhone(phone)); Optio..

JPA 엔티티간 연관 관계 매핑 (feat. Fetch전략, Cascade)

JPA 엔티티간 연관 관계 매핑 JPA에서 연관 관계 매핑은 단방향 연관 관계와 양방향 연관 관계가 있으며 방향성과 관계없이 일대다(1:N), 다대일(N:1), 다대다(N:N), 일대일(1:1)관계가 존재한다. JPA 엔티티의 연관 관계를 매핑할때 보통 다대다(N:N)의 구조를 일대다(1:N)와 다대일(N:1)로 분리하고 분리된 관계들을 각각 단방향으로 다대일(N:1)로 연결해준 뒤 필요에따라 일대다(1:N)로 양방향 연결을 해준다. 위의 관계도를 보면 Order와 Coffee간 다대다 관계를 OrderCoffee로 일대다 다대일 관계로 나누었다. 또한 Order와 Member는 다대일 관계이며 Member와 Stamp는 일대일 관계이다. 다대일(N:1) 연관 관계 @Getter @Setter @Buil..

JPA의 Entity 매핑 (feat. Auditable, GeneratedValue 전략)

Entity와 테이블간의 매핑 @Getter @Setter @Builder @Entity // 1. public class Member extends Auditable { // 8. @Id // 2. @GeneratedValue(strategy = GenerationType.IDENTITY) // 3. private Long memberId; @Column(nullable = false, updatable = false, unique = true) // 4. private String email; @Column(length = 100, nullable = false, name = "FULL_NAME") private String name; @Column(length = 13, nullable = fals..

JPA(Java Persistence API)

JPA JPA(Java Persistence API)는 Java 진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양(또는 명세, Specification)이다. Java의 인터페이스로 사양이 정의되어 있기 때문에 JPA라는 표준 사양을 구현한 구현체는 따로 있다. Hibernate ORM Hibernate ORM는 JPA 표준 사양을 구현한 구현체중 하나이다. 쉽게말하면 JPA라는 표준사양을 구현하는 API이며 JPA에서 지원하는 기능 이외에 Hibernate 자체적으로 사용할 수 있는 API 역시 지원하고 있다. JPA는 Java Persistence API의 약자이지만 현재는 Jakarta Persistence라고도 불린다. 데이터 액세스 계층에서의 JPA 위치..

Spring Data JDBC에서 Offset-Pagination 적용하기

페이지네이션(Pagination) Pagination이란 데이터 베이스에 회원 정보가 100건이 저장되어 있는데 클라이언트 쪽에서 100건의 데이터를 모두 요청하는 것이 아니라 한 페이지에 일정 개수만큼만 나누어서 달라고 요청하는 것을 페이지네이션(Pagination)이라고 한다. Pagination에는 Offset Pagination과 Cursor Pagination이 있다. Offset Pagination 출력되는 모든 결과물을 특정한 개수만큼 나누어 페이지별로 제공하는 형식이다. 일반적인 게시판 형태(검색 엔진 등)이다. Cursor Pagination 정해진 개수만큼의 데이터를 가저와 로드하고 이후 로드된 마지막 데이터부터 다시 정해진 개수만큼의 데이터를 가저와 로드하는 형식이다. SNS에 주로 ..

Spring Data JDBC

Spring Data JDBC Spring Data JDBC는 Spring에서 데이터베이스에 접근하는 다양한 기술들중 하나로 JDBC API 안에서 작동한다. 또한 ORM기술이 적용되어 SQL문을 직접 작성하는 것이 아닌 객체를 통해 데이터베이스에 접근 할수 있는 기술이다. ORM (Object Relational Mapping) 이란 객체 지향 프로그래밍 언어와 SQL문을 맵핑해주는, 즉, 두 언어를 서로 변환시켜 관계형 데이터베이스에 접근 할수 있도록 해주는 기술이다. Spring Data JDBC 사용 라이브러리 추가 dependencies { ... ... implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' //Sprin..

JDBC(Java Database Connectivity)

JDBC(Java Database Connectivity) JDBC란 자바에서 데이터베이스에 접속할 수 있도록 하는 자바API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다. - 위키피디아 ( https://ko.wikipedia.org/wiki/JDBC ) JDBC는 자바 애플리케이션에서 데이터베이스에 접근하기 위한 표준 스펙이다. 즉, JDBC를 이용하여 자바코드로 데이터베이스에 접근하여 데이터를 생성, 수정, 삭제 등의 작업이 가능하며 다양한 벤더(Oracle, MS SQL, MySQL 등)의 데이터베이스와 연동할 수 있다. 자바 애플리케이션에서 JDBC API를 통해 JDBC 드라이버를 로딩한 후, 데이터베이스에 접근한다. JDBC 드라이버는 RDBMS의 종류에 따..