Spring
[JPA] @EntityGraph 란?
[JPA] 일반 Join과 Fetch Join의 차이 에서 N+1문제를 해결하기 위해 fetch join을 쓴다는 것을 알 수 있었죠! @EntityGraph는 바로 Spring Data JPA에서 fetch join을 어노테이션으로 사용할 수 있도록 만들어 준 기능입니다! 일반적으로 fetch join을 사용하기 위해서는 아래코드처럼 JPQL을 직접 입력해주어야하는 수고로움이 있습니다. @Query("SELECT distinct t FROM Team t join fetch t.members") public List findAllWithMemberUsingFetchJoin(); 하지만 @EntityGraph를 사용하면 이렇게 간편하게 바뀔 수 있습니다 :)) @Override //기본 적으로 findAl..
[JPA] 일반 Join과 Fetch Join의 차이
Spring Data JPA(이하 줄여서 JPA)를 사용하다보면 연관 관계 맵핑이 된 엔티티를 사용하면서 N+1의 문제를 마주하고는 합니다. 예를 들어 우리가 보통 DB에서 연관 맵핑 관계를 볼때는 join 문을 사용해서 쿼리를 만들지만 이상하게 JPA repository로 엔티티를 호출하면 연관된 맵핑만큼 select 쿼리가 만들어집니다 바로 N+1번 쿼리가 진행되는것이죠. 이때 보통 아래 코드처럼 fetch join 이 들어간 JPQL 코드를 작성해서 문제를 해결합니다 @Query("SELECT distinct t FROM Team t join fetch t.members") public List findAllWithMemberUsingFetchJoin(); 왜 일반 join으로는 해결을 못할까요? ..
[JPA] 즉시 로딩(FetchType.EAGER)과 지연 로딩(FetchType.LAZY)
Spring Data JPA (이후 줄여서 JPA)를 사용할때 우리는 엔티티를 영속성 컨테스트에 저장하고 flush 해주는 방식으로 DB에 저장했습니다. 엔티티가 RDB의 테이블과 맵핑된 경우, 모든 테이블이 독립적이지 않아서 필요에 따라 테이블을 join 해서 사용하는 경우가 자주 발생합니다. 이럴 경우 우리는 엔티티에 @OneToOne, @ManyToOne, @OneToMany, @ManyToOne 어노테이션을 이용해서 알려줍니다. 예를 들어 아래 코드를 한번 볼까요? @Getter @Entity public class Classroom { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String cl..
[Spring Boot] AutoConfiguration 이란?
AutoConfiguration 즉 자동 환경설정은 스프링부트의 가장 큰 장점 중 하나입니다. 비즈니스 로직을 제외한 많은 부분에서 개발자가 직접 구현하거나 코드를 써야하는 일을 줄여주기 때문입니다. 오늘은 스프링부트의 이러한 자동 설정환경이 어디서부터 어떻게 실행되고, 무엇을 실행시켜주는지 알아봅시다! 스프링 부트(Spring Boot)의 시작 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 스프링 부트 프로젝트를 처음 생성하면 다음과 같은 메인 애플리케이션 클래스를 보실 수 있습니다. main()..
[JPA] 영속성 컨텍스트(Persistence Context)란?
처음에 Young속성? 어린 속성인가? 라고 생각했던 제 자신이 부끄러워지는 순간입니다... 하하 자 JPA 라는 개념을 접하면 반드시 마주하는 단어가 바로 이 영속성 컨텍스트인데요! 오늘은 살짝 복잡하지만 저희의 삶을 편하게 해주는 JPA의 영속성 컨텍스트에 대해 알아보겠습니다! 영속성 컨텍스트(Persistence Context)의 개념 "영속성"은 사전적인 의미로 "오래도록 또는 영원히 계속되는 성질이나 능력"입니다. 프로그래밍 상에서 영원이 계속된다는 건 무슨 뜻일까요? 바로 프로그램이 아무리 종료되고 재시작되어도 남아있는 것이죠. 예를 들면 프로그램이 실행된 후 부터 생명주기를 가지는 객체보다는, DB에 저장된 데이터가 영속성을 가졌다고 볼 수 있겠죠. 이러한 뜻에서 영속성 컨텍스트란 엔티티를 ..
[Spring] JPA, Hibernate, Spring Data JPA 는 다르다!
혹시 JPA에 대해 이런 경험이 있으신가요? A: 어? JPA 저도 쓰는데요 그거 완전 편하죠 ㅎㅎㅎ 막 findBy어쩌구하면 DB에서 다 찾아주잖아요 나: 아 그래요? (구글검색) J..P..A..란..? -> JPA란 "자바 ORM에 대한 API 표준 명세"이다. 나: 아니 API 도 아니고 그냥 표준 "명세"라는데 그걸 쓸수가 있나..? 나: J..P.....A 사용법 검색 -> 안녕하세요 잇님들 요즘 날씨가 쌀쌀하죠^^ 오늘은 JPA를 사용해보는법에 대해서 알아볼거에요. 이렇게 설정해주세요 #JPA 설정 #하이버네이트 Dialect (사투리) 설정 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect #하이버네이트..
[Spring Batch] Chunk와 Tasklet의 차이
[Spring Batch] 스프링 배치(Spring Batch) 란? 편에서 스프링 배치에 대해서 설명했었습니다! 요약하자면 데이터를 일괄적으로 처리하기위한 애플리케이션이라고 할 수 있을것 같네요.이를 위해 Job과 Job을 구성하는 한개 또는 여러개의 Step이 존재했었죠. 스프링 배치는 Step 을 Chunk와 Tasklet 두가지 방식으로 제공합니다. 두개가 어떻게 다르고, 어떤 상황에서 무엇을 써야할지 지금부터 알아보겠습니다! Chunk 방식 Chunk 방식을 이해하려면 먼저 아래에 대한 이해가 필요합니다. ItemReader: DB 또는 파일에서 데이터를 읽어오는 역할을 합니다. ItemReader에 대한 다양한 인터페이스가 존재하며 다양한 방법으로 Item을 읽어 올 수 있습니다. ItemPr..
[Spring Batch] 스프링 배치(Spring Batch) 란?
배치(Batch)란? Batch 라는 단어는 일괄처리 라는 뜻을 가지고 있습니다. 따라서 배치 애플리케이션(Batch Application)이란 단발성으로 대용량의 데이터를 처리하는 애플리케이션을 의미합니다. 배치 애플리케이션은 다음의 조건을 만족해야 합니다. 대용량 데이터: 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 합니다. 자동화: 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 합니다. 견고성: 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다. 신뢰성: 무엇이 잘못되었는지를 추적할 수 있어야 합니다. (로깅, 알림) 성능: 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도록 수행되어야합니다. 스프링 배치란?..
[Java] 싱글톤 패턴 (Singleton Pattern)
세상에 무한으로 존재하는 자원은 없습니다. 컴퓨터도 마찬가지죠. 가비지 컬렉션(GC)편에서도 볼 수 있듯 이러한 한정된 메모리를 최대한 효율적으로 사용하는 방법은 여러가지가 있습니다. new MyClass() 같은 코드로 객체를 새롭게 생성을 하면 새로운 메모리 공간에 해당 객체를 위한 정보가 쓰이게 되겠죠. 하지만 하나의 객체만 생성해서 계속해서 재사용하면 어떨까요? 바로 이처럼 싱글턴 패턴은 하나의 객체만을 생성해서 이후에는 처음에 생성된 객체를 반환하여 프로그램 전반에서 하나의 인스턴스만을 사용하게 하는 패턴입니다. 싱글톤 패턴 적용 예제 public class Test { public static void main(String[] args){ DannySingletonClass singletonC..
[Spring] IoC(Inversion of Control) - 제어의 역전 이란?
스프링 프레임워크(Spring Framework) 하면 또 빼놓을 수 없는 단어가 DI, IoC가 아닐까 싶은데요! IoC는 스프링 뿐만 아니라 다른 프레임워크에서도 사용되는 범용적인 개념입니다. 왜 IoC라는게 생겼을까요? 무엇을 제어하고 왜 역전이 필요한것일까요? 천천히 한번 알아봅시다. 여기서 제어는 무슨뜻인가요? 여기서 제어라는건 "객체에 대한 주도권을 가지고 있다"라고 생각하셔도 될 것 같습니다. 자바는 객체지향 프로그래밍 언어이고, 모든 객체는 생명주기(Life Cycle - 객제가 생성된 후 부터 폐기될 때까지의 기간) 를 가지고 있습니다. 일반적으로 프레임워크를 사용하지 않는다면, 자바 프로그램은 main() 메소드에서 시작해서 개발자가 미리 정한 순서를 따라 실행됩니다. 따라서 언제 객체..