본문 바로가기

프로그래밍/Java & Spring11

Spring Cloud Service Discorvery 서비스 디스커버리란? MSA로 구성되어 있는 서비스들은 각자 ip와 포트를 가지고 있고 이런 정보를 관리할 필요가 생기는데 이런 관리 서비스를 Service Discorvery라고 합니다. 스프링에서 서비스 디스커버리를 유레카 클라이언트를 이용해 구현했는데요. 공식 문서를 자세히 보면 나와 있습니다. https://docs.spring.io/spring-cloud-netflix/docs/4.0.0/reference/html/#netflix-eureka-client-starter Spring Cloud Netflix This project provides Netflix OSS integrations for Spring Boot apps through autoconfiguration and binding t.. 2023. 3. 25.
gradle test코드를 패키지 단위로 제외시키는 방법 test 코드를 패키지 단위로 제외시키는 방법 실무에서 테스트 자동화 도입시 study를 위한 테스트 코드는 제외해야되는 경우가 생겼습니다. gradle에서 test 메소드를 만들때 아래와 같이 exclude를 하면 해당 패키지는 test할때 제외 됩니다. test { systemProperty 'spring.profiles.active', 'test' useJUnitPlatform { exclude("com/study/**/*.class") } } 2022. 9. 16.
CompletableFuture와 daemon Thread 기본적으로 CompletableFuture 내부적으로 ForkJoinPool.commonPool() 을 사용합니다. (구현 참조 CompletableFuture). 그리고 ForkJoinPool.commonPool()은 데몬 스레드만 생성합니다. jvm은 데몬 스레드의 종료를 기다리지 않습니다. jvm이 종료되는 과정에서 실행중인 데몬스레드가 있다면 그냥 죽인다. 그래서 join, get으로 기다리게끔 처리하여야 로직에서 계속 처리를 기다린다. import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.time.LocalDateTime; import java.util.concurrent.*; public .. 2022. 9. 2.
Java Spring OOM 분석 및 해결 후기 최근 회사 어플리케이션을 배포 후 몇시간안에 다운되는 현상이 있었고 OOM문제가 생긴걸 알게 되었습니다. OOM을 어떻게 분석하고 해결했는지 정리하고자 합니다. 원인 원인은 간단했습니다. 저희 서비스는 자바11버전을 사용하고 있었습니다. ForkJoinPool을 사용하는 로직을 새로 배포하였는데요. 자바8과 자바11에서 ForkJoinPool이 내부적으로 차이가 있었고 gc에서 메모리 해제하는 시간이 느려져 OOM이 이슈가 발생된 것이였습니다. https://meetup.toast.com/posts/291 을 참고해서 원인을 파악했습니다. 해결 ForkJoinPool을 지역변수로 사용하였지만 Service계층에서 생성자를 이용하여 한번만 객체 생성하고 해당 thread를 계속 재사용하는 방법으로 간단하게.. 2022. 8. 18.
Flyway 에러처리 Flyway 란? Welcome to Flyway, database migrations made easy. Flyway는 오픈 소스 데이터베이스 마이그레이션 도구입니다. - flywaydb.org- 플라이웨이는 디비 마이그레이션 도구로써 데이터베이스 형상관리를 위해서 사용합니다. 형상관리란 소프트웨어의 변경사항을 체계적으로 추적하고 통제하는 것으로, 형상 관리는 일반적인 단순 버전 관리 기반의 소프트웨어 운용을 좀 더 포괄적인 학술 분야의 형태로 넓히는 근간을 이야기합니다. 자세한 내용은 우아콘 flyway 를 참고하시면 좋을거 같습니다. Flyway_schema_history flyway_schema_history는 flyway사용할때 생기는 테이블 입니다. flyway를 사용하면 sql 파일을 돌면서.. 2022. 6. 16.
configuration test 대체하기 왜 사용했나요? 테스트 자동화 도입 중 여러 DataSourceConfiguration중에서 RedshiftDataSourceConfiguration 가 있는데 TestContainer에서 제외하고 싶어서 사용했습니다. 어떻게 사용했나요? @TestConfiguration를 붙이고 아래와 같이 작성합니다. @TestConfiguration @Profile({"test"}) public class TestRedshiftDataSourceConfiguration { @Bean(name = "redshiftDataSource") public DataSource redshiftDataSource() { return new DataSource() { //... } //... } } 테스트 하고 싶은 클래스에 @I.. 2022. 5. 7.
스프링 이벤트 프로그래밍 적용하기 안녕하세요. 오늘은 이벤트 기반 프로그래밍에 대해서 알아보고 스프링부트에 적용해보는것까지 확인해보겠습니다. 이벤트 기반 프로그래밍이란? ‘사건’에 따라, 제어 흐름이 결정되어 일을 하도록 하게끔 만들어진 프로그래밍 언어 방식을 뜻한다. -위키백과- 스프링 이벤트는 언제 사용할까? 서비스간의 결합도를 낮추고 싶을때 서브 로직이 에러가 나더라도 메인 로직은 정상적 완료 하고 싶을때 이커머스 도메인으로 해당 상황을 고민해보자면 사용자가 회원을 가입합니다. 회원 가입할때 웰컴쿠폰을 발행합니다. 기존에는 회원가입 서비스에서 쿠폰서비스를 의존하여 사용했습니다. 쿠폰 발행시 에러가 나면 회원가입도 에러가 나서 회원가입이 롤백되었습니다. 스프링 이벤트를 적용하면 두가지 문제를 해결 할 수 있습니다. 구현 코드 간단한.. 2022. 5. 7.
@SpringBootTest @Transactional rollback @SpringBootTest @Transactional rollback 열심히 springboottest 코드를 짜는 와중에 @DataJpaTest처럼 @Transactional rollback이 자동으로 되는줄 알았습니다.. 그래서 알아보니 @Transactional 어노테이션을 붙여야 rollback처리가 되었습니다. 더 알아보니 WebEnvironment.RANDOM_PORT는 롤백이 안될 수 있다고 하여 직접 테스트 해보았습니다. RollBack처리가 잘 됨을 알 수 있었습니다. 테스트한 코드 GitHub - lsm7179/board Contribute to lsm7179/board development by creating an account on GitHub. github.com 결론 @Spr.. 2022. 3. 13.
Spring4 Junit 테스트 코드 작성기 안녕하세요. 방구석 개발자입니다. 현재 프로젝트는 스프링4, 전자정부프레임워크를 이용하여 진행하고 있습니다. 스프링부트가 아니여서 아쉽지만 코드품질을 높이고자 테스트 코드를 작성하려고 합니다. 테스트 코드 작성 각 MVC 패턴에 맞게 테스트 코드가 이루어져야 된다고 생각하여 각 패턴에 맞는 샘플 테스트 코드를 작성해보겠습니다. 우선 pom.xml 에 필요한 dependecy 추가했습니다. junit junit 4.12 test org.springframework spring-test 4.3.22.RELEASE test ControllerTest @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath*:ego.. 2021. 9. 20.
ThreadPoolTaskScheduler를 이용하여 자바 스케줄러 구현 및 강제종료 구현 안녕하세요. 방구석 개발자입니다. 현재 진행중인 프로젝트에서 원하는 시간대 실행되는 배치를 등록하고 실행하는 기능을 만들어야 돼서 ThreadPoolTaskScheduler를 이용하여 구현하였는데요. ThreadPoolTaskScheduler가 뭔지 또 어떻게 사용되는지 알아보도록 하겠습니다. ThreadPoolTaskScheduler란 ThreadPoolTaskScheduler는 태스크실행 및 스케줄링에 사용되는 스프링 라이브러리 입니다. 배치 관리 할때 Thread를 개발자가 직접 제어하지 않고 실행하고 싶은 Task와 시간을 Pool에 넣습니다.그러면 ThreadPoolTaskScheduler에서 제어하여 해당 시간에 맞춰서 Thread를 생성 및 실행 시키고 종료 까지 해줍니다. 스프링 공식 문서.. 2021. 8. 2.
[스트림API] StreamAPI란 무엇인가? 사용예제 서론 안녕하세요. 방구석 개발자 입니다. 실무에 사용하고자 StreamAPI 를 공부하고 적용시키려고 합니다. 그래서 사용한 예제를 몇가지 포스팅하겠습니다. 제가 사용한 예제는 공부목적으로 작성하였고 자바공식문서를 보면 더욱 더 많은 메소드가 있습니다. 또한 JAVA Stream API 는 간혹 기존 코드 보다 성능이 떨어진다는 이야기가 많습니다. 실무에 적용 할때는 더욱 주의 해야 될 거 같습니다. StreamAPI 이란? 스트림api는 자바8 부터 추가된 기능으로 컬렉션, 배열 등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를적용하며 반복적으로 처리할 수 있도록 해주는 기능입니다. 기존 코드 보다 가독성이 좋고 사용하기 편하게 되어 있습니다. Stream 의 구조는 크게 3가지로 나뉩니다.. 2021. 6. 14.
반응형