전체 글
-
JPA n+1을 해결하는 방법카테고리 없음 2023. 4. 21. 15:26
이번에는 JPA의 n+1을 해결하는 방법을 한번 살펴보자. n+1의 예를 한번들어보자. 어떤 Account 라는 엔티티와 Order라는 엔티티가 있다고 가정하자. @Entity public class Account { @Id @GeneratedValue @Column(name = "ACCOUNT_ID") private Long id; private String name; private String password; private String email; @OneToMany(mappedBy = "account", fetch = FetchType.LAZY) private List orders; } //getter setter etc.. @Entity public class Order { @Id @Genera..
-
spring jpa QuerydslBinderCustomizer카테고리 없음 2023. 4. 21. 15:26
이번 시간에 알아볼 것은 querydsl의 QuerydslBinderCustomizer을 알아볼 예정이다. QuerydslBinderCustomizer는 인터페이스이며 추상 메서드는 void customize(QuerydslBindings bindings, T root) 한개를 갖고 있다. 현재 필자는 회사나 집에서 java8을 쓰기 때문에 java8 기준으로 설명한다 아주 상세하게 컨트롤은 하지 못해도 기본적인 동적쿼리(예로 있으면 검색 아니면 검색하지 않는다)를 간단하게 만들수 있다. 뭐 기능이 얼마나 있는지는 모르겠지만 일단 필자가 테스트한 경우는 기본적인 것만 해봤기 때문에 그것만 설명을 하겠다. 예전에 querydsl를 공부할때 남겨두었던 클래스들을 재 사용했다. public interface ..
-
spring transaction 전파카테고리 없음 2023. 4. 21. 15:26
이번 시간에는 spring transaction 전파에 대해서 알아볼 예정이다. transaction 전파란 현재 transaction 에서 다른 transaction 으로 이동할 때를 이야기 한다. 예를들어 AccountService에 transaction이 걸려 있는데 다른 OrderService 에서도 transaction 이 걸려 있는 것을 말한다. 같은 클래스는 해당 사항이 없다. 간단하게 확인 가능한 테스트 코드를 보자. 아래는 AccountService클래스 이다. @Autowired private TransactionService transactionService; @Transactional public AccountTest transactionTest(AccountTest accountT..
-
spring boot session redis and nginx카테고리 없음 2023. 4. 21. 15:26
이번시간에 포스팅 할 것은 spring boot redis 로 세션관리를 하며 로드밸런싱을 사용하기 위해 nginx를 사용해 보겠다. 일단 nginx와 redis 가 설치 되어 있다고 가정하자. 설치 방법들은 각자 인터넷으로 찾아서 ... 레디스는 먼저 서버를 실행시켜도 된다. 먼저 spring boot redis를 살펴보자. 완전 간단하게 실행 시킬수 있다. 프로젝트를 생성하고 maven에 다음과 같이 추가 하자. spring boot 버전은 현재 최신 버전인 1.3.5 버전이다. 기본적으로 spring boot를 아는 기준으로 하겠다. org.springframework.boot spring-boot-starter-redis org.springframework.session spring-session..
-
mongodb 간단하게 해보기.카테고리 없음 2023. 4. 21. 15:26
설치는 인터넷이 자세히 나와 있으니 참고 하길 바란다. 맥 경우에는 brew으로 간편하게 설치도 가능하니 참고하길 바란다. https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/ 우리는 간단하게 커멘드 창에서 CUD를 해보겠다. 몽고 서버와 몽고 클라이언트를 실행시키자. select는 공부할게 많으니 나중에 다시 해보겠다. insert > db.user.insert({ name: "wonwoo", age : 27, email: "test@test.com" } ) WriteResult({ "nInserted" : 1 }) nosql 이니 json으로 들어간다. > db.user.insertOne({ name: "wonwoo1", age : 20..
-
logback-flume-kafka-appender카테고리 없음 2023. 4. 20. 09:53
요 몇일전에 log를 수집하기 위해 회사에서 만든건데 내가 만들어 영 시원찮아 그냥 안쓰기로 했다. 그래도 만약 필요한 사람들이 있다면 고쳐서 쓰면 좋을 것 같다. logback에 flume을 내장해서 kafka에 보내는 라이브러리다. 일단 카프카가 설치 되어 있어야 한다. 카프카 설치는 여기서 보고 따라하며 된다. zookeeper와 kafka, 그리고 kafka consumer를 실행 시키자. 그 다음에 아래와 같이 메이븐에 추가 하자. spring-boot-gcm-mvn-repo https://raw.github.com/wonwoo/logback-flume-kafka-appender/mvn-repo/ me.wonwoo logback-flume-kafka-appender 0.9.0-SNAPSHOT 그..
-
spring boot querydsl study (4)카테고리 없음 2023. 4. 20. 09:53
이번 시간에는 join에 대해서 알아보자. querydsl에서는 다음과 같은 조인을 지원한다. join inner join, left join, right join 일단 차례대로 한번씩 살펴보자. join QAccount account = QAccount.account; QOrder order = QOrder.order; return from(account) .join(account.orders, order) .fetch(); join이라는 함수를 쓰면 join을 한다. join과 innerjoin의 차이점은 잘 모르겠다. 동일하게 작동하는 듯한데.. 쿼리를 보자. select account0_.account_id as account_1_0_, account0_.email as email2_0_, acc..
-
spring boot querydsl study (3)카테고리 없음 2023. 4. 20. 09:53
이번시간에는 서브쿼리와 프로젝션에 대해서 알아보자. 서브쿼리는 우리가 sql에서 말하는 서브쿼리와 동일하다. 일단 서브쿼리의 예제를 한번 살펴보자. QItem item = QItem.item; QItem itemSub = QItem.item; return from(item) .where(item.price.eq( JPAExpressions.select(itemSub.price.max()).from(itemSub) )).fetchOne(); 그냥 딱 봐도 일반 sql와 문법이 비슷하기에 설명은 하지 않아도 될 듯 싶은데.. item에서 가장 비싼 상품을 찾아서 반환하는 그런 query이다. 아주 간단하기 때문에 눈으로 흘겨봐도 알 듯싶다. 물론 복잡한거는 나도 모른다. 우리는 예젠에는 JPASubQuery..