목록백앤드 개발일지/스프링부트 (28)
늘
대표적으로 외부 api를 호출하는 방식에 resttemplate이 있는데 이것은 동기 방식을 이용한 방법이고, WebClient가 비동기를 이용한 방식이다. 공식문서를 보면 스프링 5부터는 webClient사용을 더 추천하고 있다. 또한 restTemplate은 곧 deprecated 된다고 한다. 공통점으로는 둘 다 Http client에서 사용된다는 것이다. RestTemplate RestTemplate은 Multi-Thread와 Blocking방식을 사용합니다. Thread pool은 요청자 어플리케이션 구동 시에 미리 만들어 놓습니다. Request는 먼저 Queue에 쌓이고 가용한 스레드가 있으면 그 스레드에 할당되어 처리됩니다. 즉, 1 요청 당 1 스레드가 할당됩니다. 각 스레드에서는 Blo..
시험기간이라 오랜만에 포스팅하는 것 같다...ㅠ 빨리 시험 끝났으면~😗😗 logback을 파일로 저장해도 좋지만, aws에서 제공해주는 cloud watch를 이용하면 로컬에 파일을 저장 안 해도 되고, 시각적인 지표도 볼 수 있으므로 더욱 유용하다. 따라서 springboot에서 logback으로 cloudwatch에 보내서 aws에서 관리하도록 하겠다. gradle implementation 'ca.pjer:logback-awslogs-appender:1.4.0' aws IAM 정책 설정 - CloudWatchAgentServerPolicy 정책을 추가해서 EC2에 연결 Cloudwatch-agent 설치 $ wget https://s3.amazonaws.com/amazoncloudwatch-agen..
프로젝트가 거의 막바지 단계에 다다라서 운영할 때 꼭 필요한 로그를 찍으려고 한다. 이번 로그는 AOP를 이용해서 찍었지만 다음번에는 인터셉터를 이용해서 찍어보려고 한다. (경험은 많을수록 좋으니😇😇) Log설정 build.gradle implementation 'org.springframework.boot:spring-boot-starter-aop' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8' 우리는 aop를 적용할것이기 때문에 aop와 p6spy라이브러리를 추가해준다. slf4j slf4j2 p6spy는 나중에 정리해보도록 하겠다. 참고 주소는 글 맨 아래에 남겨두겠다! logback-spring.xml appli..
백신 2차까지 맞고 팔을 잃었지만 아직 나에겐 다른 한쪽 팔이 남았다 🤫🤫 귀와 팔 한쪽이 멀쩡하기 떄문에 우아한 세미나에서 기선님의 강의를 듣고 직접 적용해보고 정리해보려고 한다. 멋있음ㅋ META-INF/spring.factories 에서 이렇게 자동 설정을 한다. 이러한 자동설정들이 제공되어 있는 게 스프링 부트이다. 순서는 애플리케이션 설정한 빈이 먼저 등록되고 그 후에 자동 설정으로 제공하는 빈이 등록된다. 만약 앞에서 애플리케이션에서 설정한 빈 등록이 있고, 자동 설정으로 제공하는 빈의 빈 아이디가 중복이 되있다면 충돌 나서 애플리케이션이 뜨지 않는다. 또한 자동 설정으로 제공하는 빈끼리도 중복되면 충돌나서 애플리케이션이 뜨지 않는다고 한다. application.properties/ appl..
테스트코드를 작성해보면서 JUnit4나 5를 사용하는데 이번 포스팅에서 4와 5를 비교하고 JUnit5 사용법에 초점을 맞춰서 정리해두려고한다. Junit5 Platform: Junit으로 작성한 테스트를 실행해주는 런처를 제공한다. TestEngineApi 제공한다. Vintage: Junit3과 4를 지원하는 TestEngine 구현체 Jupiter: Junit5를 지원하는 TestEngineApI 구현체 Junit 5는 스프링부트 2.2 버전 이상부터는 기본적으로 의존성이 장착되어 따로 설정할 필요가 없다. Junit5의 애노테이션들 @Test - 테스트 메서드를 나타내주는 애노테이션이다. - Junit4와 달리 어떠한 속성도 선언하지 않는다. //Junit4 @Test(expected = Exce..
WHEN? 언제 무엇이 왜 사용되는가? - 로그인 처리 방식에 대해서 고민하면서 필터와 인터셉터를 공부했는데 둘이 비슷하다고 생각되고 둘 중에 어느 때에 무엇을 선택해야 할지 명확한 해답이 안 나와서 글을 적으면서 정리해보려고 한다. *공부를 하던 중 AOP와도 비교를 하는 글들이 보여서 짧게 추가해보았다. (개인적인 생각!) 우선 AOP는 앞서 필터와 인터셉터와는 다르게 비즈니스적 관점에서 사용할 때, 사용된다고 생각된다. ex) 로직의 시간 측정, 트랜잭션 관리, 에러 처리 등, 반면에 필터나 인터셉터는 인증/인가, 세션 체크, 인코딩 확인 등 좀더 웹과 관련된 공통 관심사 처리하는 느낌으로 구별하면 될 것 같다. 이제 본격적으로 필터와 인터셉터를 분석해 보겠다. 제목에서도 보았듯이 필터는 Dispa..
[build.gradle] plugins { id 'org.springframework.boot' version '2.3.1.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } depend..
이번에는 JPA 기본을 중심으로 Batch 처리에 대해서 조금 다뤄보려고 한다. 저번 시간에 얘기 했던 것처럼 수백만 건의 배치 처리할 때, 일반적인 방식으로 엔티티를 계속 조회하면, 영속성 컨텍스트에 많은 엔티티가 쌓이면서 메모리 부족 오류가 발생한다. 따라서 이러한 배치 처리를 적절한 단위로 영속성 컨텍스트를 초기화해야 한다. 또한 2차 캐시를 사용하고 있다면 2차 캐시에 엔티티를 보관하지 않도록 주의해야 한다. [JPA 등록 배치] 수만 건 이상의 엔티티를 한 번에 등록할 때 주의할 점은 영속성 컨텍스트에 엔티티가 계속 쌓이지 않도록 일정 단위마다 영속성 컨텍스트의 엔티티를 데이터베이스에 플러시하고 영속성 컨텍스트를 초기화해야 한다. EntityManager em = entityManagerFact..
요즘 공부하다 배치 애플리케이션을 자주 보게 되어서 공부를 해보았다. 공부하다 보니 자료도 적어 찾기 어려웠고 대용량 데이터를 다루는 데에 사용한다고 하니 나 같은 대학생 나부랭이에겐 어렵게 다가왔다. 하지만 언젠가는 사용할게 분명하기 때문에 미리 맛보는 겸 공부하고 기록해 보려고 한다! 우선 배치 어플리케이션이 왜 필요하는지 그 이유부터 알아보겠다. 왜 사용하는 가?why why.. wh.. [배치 애플리케이션] 배치(Batch)는 일괄처리라는 뜻을 가지고 있다. 만약 매일 전 날의 데이터를 집계해야 한다고 가정해보겠습니다. 집계 기능은 하루에 1번 수행됩니다. 이를 위해 API를 구성하는 것은 너무 낭비일 것이다. 데이터가 많아서 처리 중 5만 번째에서 실패했다면, 5만 1번째부터 다시 실행할 수 있..
1차 캐시: @Id와 Entity 스냅샷: 1차캐시에 처음 영속되었을 때의 상태 findByName()과 같이 id가 아닌 값으로 조회를 하면 바로 DB에 접근하게 된다. 플러시 flush(): 영속성 컨텍스트의 내용을 디비에 반영 1차 캐시에 넣어둔게 사라진게 아님! 그냥 반영만 - 동기화 플러시 발생 flush()가 될때 -> 변경 감지-> 수정된 엔티티를 쓰기 지연 SQL저장소 등록 -> 쓰기 지연 SQL저장소의 쿼리 디비에 전송 같은 테이블, JDBC Driver지원, 하이버네이트 같을 때, 디비로 일괄 전송되는 것 영속성 컨텍스트 플러시 할 때 em.flush() - 직접호출 ex) test 트랜잭션 커밋 - 자동 호출 JPQL 쿼리 실행 - 자동 호출 jpql은 객체를 대상으로 하는 sql이므..