Spring

    [Cache] EHCache 란?

    EHCache(ehcache) 는 Spring에서 간단하게 사용할 수 있는 Java기반 오픈소스 캐시 라이브러리 입니다. 보통 캐시 엔진하면 redis, memcached가 떠오르만, 이 둘과 달리 ehcache는 데몬을 가지지 않고 Spring 내부적으로 동작하여 캐싱처리를 합니다. 따라서 ehcache는 Spring Application과 라이프사이클을 함께합니다. (애플리케이션이 죽으면 같이 죽습니다) 왜 redis, memcached를 놔두고 ehcache를 사용하죠? 가장 큰 이유는 가볍고 빠르다 입니다. redis, memcached 같은 경우 우선 별도의 데몬으로 실행되야합니다. 벌써 도입시점부터 관리포인트가 늘어난것이죠. 그에비해 ehcache는 spring 내부적으로 동작하며 단순 캐시 ..

    [Maven] Maven dependency의 Scope 옵션

    Maven 빌드 툴 사용시 pom.xml 내 dependency 태그안에서 을 보신적이 있지 않으신가요? 이는 해당 의존성을 어느 시점에 포함을 시키고 어느시점에 포함시키지 않을지를 결정하는 옵션입니다. compile: scope을 명시하지 않았을 때 기본으로 적용되는 옵션입니다. 컴파일 시점에도 필요하고 배포할때도 필요할 때 사용되는 옵션입니다. 또한 이 프로젝트를 dependency로 불러온 다른 프로젝트에서도 포함됩니다. provided: 컴파일 시점에는 필요하지만 배포시점에는 불필요할때 사용되는 옵션입니다. 주로 JDK, servlet API, Java EE API 등이 해당됩니다 runtime: 컴파일시점에는 필요없지만 runtime 시점에는 필요할때 사용되는 옵션입니다. system: repo..

    [Maven] Maven이란? (feat. Maven lifecycle)

    아마 스프링 개발을 해보신 경험이 있으신 분이라면 Maven 이나 Gradle 이라는 빌드 툴에 익숙하실것 같습니다. 오늘은 그중 Maven 에 대해서 알아보겠습니다! 빌드(Build)란? 소스코드를 컴퓨터에서 실행할 수 있는 독립적인 형태(war, jar 등등)로 면환하여 JVM이나 WAS가 인식할 수 있는 구조로 패키징하는 과정과 그 결과물을 말합니다. 예를 들어 Java 프로젝트를 생성한다면, 소스코드를 컴파일해서 .class 파일로 변환하고 resource 를 .class에서 참조할 수 있는 적절한 위치로 옮기고 하나로 압축하는 과정을 의미합니다. 빌드 툴(Build tool)이란? 빌드 툴, 빌드 도구는 프로젝트 생성, 테스트 빌드, 배포등의 작업을 위한 전용 프로그램입니다. 당연히 직접 모든 ..

    [Spring] @Transactional 어노테이션 동작방식

    서버개발을 하다보면 특히 DB와 연동되는 부분에서 @Transactional 어노테이션이 자주 쓰입니다. 어노테이션을 붙여주는 것만으로도 DB에 수행되는 쿼리들을 하나의 transaction으로 묶어줄 수 있으며, 속성에 따라서는 exception 종류에 따라 rollback 도 가능합니다. 어떻게 어노테이션을 붙여주는 것만으로도 이것이 가능할까요? 지금부터 알아봅시다. @Transactional 어노테이션은 Proxy 방식으로 동작한다 "어노테이션을 붙여서 Proxy 방식으로 동작한다" 어디서 많이 보시지 않았나요? 네 맞습니다. @Transactional 어노테이션은 Spring AOP의 대표적인 예입니다. 혹시 AOP에 대해 아직 모르신다면 아래 글을 먼저 읽고 와주세요! [Spring] AOP -..

    [JPA] 비관적 락(Pessimistic Lock)과 낙관적 락(Optimistic Lock)

    JPA를 사용할때는 Transaction에 대한 격리 수준이 존재합니다. 여기서 @Transactional 어노테이션에 대해서 다루었었죠. 어노테이션의 기본값은 DB의 격리정책과 동일하게 가는 것으로 돼있는데, 대부분의 데이터베이스들은 ACID 원칙에서 격리성(Isolation)을 만족시키기 위해 READ COMMITED 수준을 사용합니다. 트랜잭션의 ACID 특성 원자성 (Atomicity): 부분적으로만 실행되거나 중단되지않는 것을 보장 일관성 (Consistency): 트랜잭션이 완료되면 일관적인 DB상태를 유지 격리성 (Isolation): 트랜잭션 수행시 다른 트랜잭션이 끼어들지 못하도록 보장 지속성(Durabuility): 성공적으로 수행된 트랜잭션은 영원히 반영 격리 수준에는 대표적으로 다음..

    [Spring] Spring AOP 프록시 - JDK Proxy(JDK Dynamic Proxy), CGLib

    [Spring] AOP - 관점 지향 프로그래밍 이란? 글에서 AOP에 대해 설명을 했었죠~! 혹시 못보셨다면 먼저 보고오시기 바랍니다! 다시 한번 짧게 요약하면, AOP(관점지향 프로그래밍)란 OOP를 보완하는 개념으로, 흩어진 관심사(cross-cutting concern)를 모듈화시킨 관점(Aspect)를 생성하여, 프록시 패턴(Proxy pattern)을 통해 비즈니스 로직에 영향없이 관점을 적용할 수 있는 그런 기법이었죠. ** 너무 한문장에 우겨넣긴했네요 ㅠ 혹시 이 문장이 이해가 안되신다면 여기를 꼭 먼저 보고와주세요! 자 오늘은 여기서 저 프록시(Proxy)에 대해서 알아볼겁니다. 이미 저 글에서 프록시 패턴에 대해 설명해주지 않았나요?? 라고 하신다면 디자인 패턴의 관점에서 프록시 패턴의..

    [JPA] @OneToMany 단방향을 사용하면 안되는 이유

    [JPA] @ManyToOne, @OneToMany 뭘 써야할까? 편에서 단방향, 양방향 맵핑에 대해서 다뤘었죠! 그리고 분명 단방향만으로 충분한 경우에는 굳이 양방향 맵핑을 안하는게 좋다고도 했는데... 사실 단방향 중에 @OneToMany 맵핑으로만 이루어진 단방향 맵핑은 사용하지 않는게 좋습니다. 뭐야?!? 단방향 쓰라더니 왜 또 쓰지 말라는거야 ㅡㅡ 라고 하실 수도 있지만.. 여기에는 당연히 이유가 있습니다. 어떤 문제가 있는지, 해결방법은 없는지 지금부터 한번 알아보겠습니다! @OneToMany 단방향 세팅 우선 Classroom, Student로 @OneToMany 단방향 맵핑을 구현해보겠습니다. // Classroom 엔티티 @NoArgsConstructor @Getter @Entity pu..

    [JPA] @ManyToOne, @OneToMany 뭘 써야할까?

    전에 Spring Data JPA를 사용할 때의 N+1문제를 다루면서 연관관계 엔티티에 대해서 이야기를 했었습니다! JPA에서는 A엔티티, B엔티티 연관성(1:1, N:1, N:N)을 명시해주면, 연관된 엔티티를 저장하거나 조회하는 것이 가능합니다. 대표적으로 다음의 어노테이션을 쓸 수 있죠! @OneToOne (1:1) @OneToMany (1:N) @ManyToOne (N:1) @ManyToMany (N:N) 우선 그럼 오늘의 주인공인 일대다 연관성을 나타내는 @OneToMany, @ManyToOne 어노테이션부터 알아볼까요? @OneToMany, @ManyToOne 예제 교실과 학생 예제를 통해서 나타내보겠습니다. 보통 하나의 교실에 여러명의 학생이 속해있겠죠! Tip) @OneToMany, @Ma..

    [Spring Boot] @Transactional 어노테이션 속성

    [JPA] 영속성 컨텍스트(Persistence Context)란? 편에서 자주 등장했던 단어 트랜잭션(Transaction)이 있습니다. Spring Boot 에서는 @Transactional 어노테이션을 통해 해당 메소드가 하나의 트랜잭션으로 묶여있다는걸 명시하는데요! 이 @Transactional 어노테이션에는 개발자가 커스텀할 수 있는 여러가지 옵션이 있습니다. 한번 살펴볼까요? Propagation 옵션 이벤트 버블링과 캡쳐링 편에서도 등장했던 Propagation이라는 단어가 다시 등장했습니다. 바로 브랜드 E 스킬처럼 전파라는 의미를 가지고 있는데요. @Transactional을 쓸 때, 스프링은 트랜잭션의 시작과 중지를 propagation 세팅을 바탕으로 관리하는데요, 이 Propagat..

    [JPA] OneToMany(1:N) 페이징 처리

    지금까지 연관 엔티티를 불러오기 위해 지연로딩과 즉시로딩 방법을 알아보았고, N+1 문제를 해결하기 위해 fetch join을 사용하는 것과 이 fetch join을 쉽게 적용할 수 있는 @EntityGraph에 대해서도 알아보았습니다. 하지만 마지막 하나 남아있는게 있습니다. DB 테이블에는 얼마나 많은 양의 정보가 있는지 모르기때문에, 특정 조건으로 데이터 리스트를 조회할때 보통 페이징 처리를 합니다. 그런데 이 연관 엔티티를 페이징 처리하려면 어떻게 해야할까요?? 보통 페이징 처리를 할때 저희는 PageRequest 객체를 만들어서 파라미터로 넘깁니다. public interface OrderRepository extends JpaRepository { Page findOrderWithOrderPr..