본문 바로가기

Spring7

Spring Data Jpa의 N+1 문제 N+1 문제란 DB에서 데이터를 조회할 때 연관된 데이터를 추가로 쿼리문을 실행해 조회하는 현상을 뜻한다. 쿼리문이 추가로 실행되는게 무슨 대수냐 할 수 있지만 대부분의 DB는 Disk I/O와 Network I/O가 발생함으로 불필요한 쿼리가 실행되지 않게 해야 성능의 부담을 줄 수 있다. JPA에서 N+1 문제가 언제 발생하는지 알아보고 해결해 보겠다. 예를 위한 Person, Team 그리고 각각 Repository를 만들어 봤다. Person.class @Entity @Data @AllArgsConstructor @NoArgsConstructor @Builder public class Person { @Id @GeneratedValue private Long id; private String na.. 2022. 2. 7.
Spring의 @Transactional Transaction 이란 여러 쿼리를 논리적으로 하나의 작업 단위로 묶는 것을 의미한다. 예로 계좌 이체가 있다. 적어도 보내는 사람과 받는 사람의 계좌는 업데이트가 되어야 한다. 이 두 번의 DB 작업을 논리적으로 하나의 작업으로 묶는 것이다. Transaction 성질 원자성 : 트랜잭션의 쿼리 결과들이 모두 반영되거나, 모두 반영되지 않아야 한다. 일관성 : 트랜잭션은 일관성 있는 데이터베이스 상태를 유지한다. 격리성 : 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야 한다. 지속성 : 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다. Spring의 @Transactional Mybatis, hiberbate, jdbcTemplate 디비 접근 기술에 따라 트랜잭션을 적용.. 2021. 12. 15.
JDK Dynamic Proxy와 CGLIB 저번 글은 AOP에 대해서 작성했었습니다. 이번 글을 Spring에서 제공하는 JDK Dynamic Proxy와 CGLib에 대해서 알아보겠습니다. 둘의 공통점은 Proxy를 통해 AOP를 제공한다는 것입니다. Proxy란 추가적인 기능을 추가해 실제 Target 객체의 기능을 호출하는 객체를 뜻합니다. 쉽게 말하기가 어렵네요. 간단히 Proxy 예를 보겠습니다. public interface ITarget { void sayHi(); } public class Target implements ITarget { @Override public void sayHi() { System.out.println("Hi"); } } public class Proxy implements ITarget { ITarget.. 2021. 12. 7.
Spring AOP AOP란 Aspect Oriented Programming의 줄임말로 관점 지향 프로그래밍이란 뜻입니다. 쉽게 말하자면 핵심 로직과 부가 로직을 분리하는 것입니다. 핵심 로직이란 실제 처리하고자 하는 로직이고 부가 로직이란 핵심 로직의 위아래로 반복적으로 나타나는 로직을 뜻합니다. 대표적인 예로 Transaction을 볼 수 있습니다. 일반적으로 트랜잭션을 적용하기 위해 AutoCommit을 해제한 후 핵심 로직을 작성합니다. 그리고 마지막 부분에 핵심 로직이 정상적으로 수행이 되었다면 Commit, 그렇지 않다면 Rollback을 시킵니다. public void transactionFunc() throws SQLException { Connection connection = null; try { con.. 2021. 12. 2.
Spring Boot에 Redis Cache 적용해보기 간단하게 Spring boot에서 Redis를 통해 Cache를 해보겠습니다. 첫째로 Redis 의존성을 추가하고 설정을 해야 합니다. builde.gradle implementation 'org.springframework.boot:spring-boot-starter-data-redis' RedisConfig.class @Configuration public class RedisConfig { @Value("${spring.redis.host}") private String redisHost; @Value("${spring.redis.port}") private int redisPort; @Bean public LettuceConnectionFactory connectionFactory() { retu.. 2021. 11. 25.
Spring JPA Specification을 사용해 유연하게 조회 API 만들기 초기 프로젝트가 작았을 때, 조회 API를 만드는 것은 크게 어렵지 않았습니다. 하지만 기능이나 데이터가 추가되면서 조건식이 추가될 때마다 Repository 메서드를 만들어야 하는 게 너무 비효율적이었습니다. 혹시나 구글링을 해보니 JPA에서 Specification라는 것을 제공해주네요. 일단 Specification을 적용하기 전부터 보겠습니다. Person, Team 엔터티와 Controller, Repository를 만들었습니다. Person.class @Entity @Getter public class Person { @Id @GeneratedValue @Column(name = "person_id") private Long id; private String firstName; private .. 2021. 11. 8.