본문 바로가기

분류 전체보기137

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.
함께 자라기를 또 읽고 나서 최근 지인이 함께 자라기 책을 읽은 후기를 가볍게 나누는 스터디를 모집 중이였고 관심이 생겨 참여 했습니다. 작년즈음에 함께 자라기를 읽은 적이 있습니다. 스터디를 꼭 참여 할 필요는 없었지만 상기하고자 한번 읽으려고 합니다. - 머릿말 중에서 스스로 변하고 싶지만 계속 실패하는 사람, 혹은 조직을 개건하기 위한 시도를 하다가 오히려 데어본 사람, 하루하루가 답답한 사람들을 위해 이 책을 썻습니다. 머릿말을 다시 읽으니 지금이 이책을 보기 적합한 시기인거 같습니다. 자라기 상반된 의견과 정보 속에서 스스로 생각하는 훈련을 해나가야 한다. 현실에서는 야생학습이 중요하고 더 많이 필요합니다. 어떤 경우에 야생학습이 필요할까요? 일반적으로 불확실성이 높은 경우일수록 중요합니다. 불확실하고 목표가 불분명한 것이.. 2022. 8. 21.
Java Spring OOM 분석 및 해결 후기 최근 회사 어플리케이션을 배포 후 몇시간안에 다운되는 현상이 있었고 OOM문제가 생긴걸 알게 되었습니다. OOM을 어떻게 분석하고 해결했는지 정리하고자 합니다. 원인 원인은 간단했습니다. 저희 서비스는 자바11버전을 사용하고 있었습니다. ForkJoinPool을 사용하는 로직을 새로 배포하였는데요. 자바8과 자바11에서 ForkJoinPool이 내부적으로 차이가 있었고 gc에서 메모리 해제하는 시간이 느려져 OOM이 이슈가 발생된 것이였습니다. https://meetup.toast.com/posts/291 을 참고해서 원인을 파악했습니다. 해결 ForkJoinPool을 지역변수로 사용하였지만 Service계층에서 생성자를 이용하여 한번만 객체 생성하고 해당 thread를 계속 재사용하는 방법으로 간단하게.. 2022. 8. 18.
온프레미스 쿠버네티스 메트릭 서버 구축 https://github.com/kubernetes-sigs/metrics-server GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container resource metrics for Kubernetes built-in aut Scalable and efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines. - GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container reso... github.com 설치한다. k.. 2022. 8. 7.
[개발자 컨퍼런스] 주니어 개발자? Super 주니어 개발자! 후기 7월30일에 주니어 개발자 컨퍼런스를 다녀왔습니다. 주니어 개발자가 9명이서 발표를 하여 다른 주니어 개발자들의 다양한 경험담과 노하우, 꿀팁을 공유했는데요. 다른 개발자들은 어떻게 성장하려고 하는지 어떤 경험과 생각을 가졌는지 알수 있는 시간이었습니다. 주니어 개발자 컨퍼런스를 보고 깨달은 점 저보다 잘하는 개발자분들이지만 성장에 대한 갈망이 공통적으로 느껴졌고 저도 더 열심히 해야겠다라는 생각이 들었습니다.특히 이직 잘하기 라는 발표에서는 단순히 연봉과 개발문화가 좋은데를 가는게 아니다. 본인이 어떻게 삶을 살아가야겠다는 목표를 가지고 해당되는 목적에 맞게 이직하는 것이 이직을 잘한것이다. 라는 발표가 인상깊었습니다. 발표자분이 그런 방식으로 이직을 해서 만족하면서 회사생활을 하고 있다는 것에도 자기.. 2022. 7. 31.
도메인 주도 설계 핵심 정리 1장 나에게 도메인 주도 설계는 좋은 설계와 나쁜 설계 작업보드 일정관리 스크럼의 가장 중요한 원칙 중 하나인 지식획득은 감안하지 않고 주로 일정 관리를 위해 스크럼을 사용하는 경우로, 정해신 일정 내에 소프트웨어 릴리스를 인도해야하는 압박감으로 인해 자주 발생한다. DDD를 통하여 밑의 다양한 비즈니스 문제를 해결 할 수 있다. 소프트웨어 개발을 이익중심이 아닌 원가 중심으로 생각한다. 문제를 신중하게 연구하고 설계하기보다는 기술적으로 해결하려고 한다. 데이터베이스에 너무 큰 우선순위를 부여 한다. 개발자가 비즈니스 목적에 따라 클래스와 오퍼레이션 이름을 짓는 것에 크게 관심이 없다. 일반적으로 비즈니스와 협업이 빈약하기 때문에 나온 문제다. 프로젝트에 대한 예측을 매우 강하게 요구한다. 개발자가 비즈.. 2022. 7. 20.
2주차 JPA 학습목표 jpa에 대해서 알아보자. 객체지향 패러다임을 경험해보자. 피드백 Entity에 기본생성자 접근제어자를 protect로 지정해주세요. Entity에 기본 생성자가 필요합니다. 이유는 JPA는 DB 값을 객체 필드에 주입할 때 기본 생성자로 객체를 생성한 후 Reflection API를 사용하여 값을 매핑하여 하용하기 때문입니다. 그렇다면 기본생성자를 public, protect 둘 중 어떤 접근제어자를 선택해야 될까요? 기본생성자는 spring data에서 사용하도록 하고 코드를 작성할때는 이용하지 못하도록 protect를 사용하는게 좋습니다. 가급적 hiberate 어노테이션 사용하지 말고 jpa 어노테이션을 이용해주세요. @UpdateTimestamp 에서 @LastModifiedDate 로.. 2022. 7. 17.
장애회고. 더 나은 서비스를 위한 마음가짐 최근 한두달 사이에 커다란 장애가 3번 있었다. db, rabitMq, kafka 가 각각 한번씩 다운 되었다. 우리회사는 모빌리티 회사다. 영업,마케팅 성공(?)으로 인해 우리서비스에 차량설치가 많아 졌고 관제서비스가 트래픽에 감당하지 못했다. 대부분은 출퇴근시간대에 트래픽이 늘어났다. 운영인프라는 내가 권한이 없었으므로 적극적으로 대응하지 못했다. 그러나 권한이 있었다고 하더라도 대응할 수 있었을까 라는 의문이 들었다. 아마 빠르게 대응하지 못했을것이다. 그러면 사용자는 서비스를 신뢰하지 못하고 사용하지 않을 것이다. 서비스 장애에 맞서기 위하여 내가 할수있는일이 없다고 하여 아무것도 하지 않으면 안된다. 지금은 무엇을 할수 있는지, 또 앞으로는 무엇을 해야할지 정리 해서 '다음 소는 잃지 않기 위해.. 2022. 7. 9.
22년 상반기 회고록 그리고 후반기에는... 안녕하세요. 방구석 개발자입니다. 올 한해도 벌써 6개월이 지났는데요. 하반기를 잘 마무리 하고자 하여 회고를 통해 남은 목표를 다시 잡아보려고합니다. 22년 목표 서비스회사로 이직(완료) * 서비스 회사로 이직하여 현재 열심히 근무중에 있습니다. 이직한 회사에 많은 기여하기 클린코드, 개발문화 등(완료) * 코드리뷰, 테스트 자동화, 테스트 코드 쉽게 짜는 방법, 안정적인 리팩토링 방법을 알리며 2~3번의 세미나도 진행했습니다. 개발문화에 기여하기(작게라도)(취소) * 목표가 너무 추상적이여서 취소하고 밑에 목료 발표 해보기로 도전해보겠습니다. 발표 1회 해보기(기술세션, 유스콘 등) * 발표주제도 생각했고 블로그에 포스팅하여 준비하겠습니다. 김영한강사님의 스프링 고급편 강의 듣기 * 아직 강의를 듣.. 2022. 7. 1.
도커(docker) 기본 명령어 모음 오늘은 도커의 기본 명령어를 몇개 나열 하고자 합니다. nginx 이미지를 받는다. docker pull nginx nginx를 80번 포트, 이름은 nx로 만든다. docker create -p 80:80 --name nx nginx 도커 상태를 확인한다. docker ps -a 를 붙이면 실행되지 않은 도커컨테이너도 확인 할 수있다. ex) docker ps -a [containder Id]가진 도커 컨테이너를 시작한다. docker start [containder Id] nginx이미지로 컨테이너를 80포트이름이 nx2 로 만들면서 시작한다. docker run -d -p 80:80 --name nx2 nginx 도커 컨테이너를 정지한다. docker stop [컨테이너명] 도커 컨테이너를 재시.. 2022. 6. 17.
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.
엘레강트 오브젝트를 읽고 나서 https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=258374007 이 책을 읽고 나서 엘레강트 오브젝트를 다 보고 나서 역자 서문을 다시 읽었다. 역자 서문의 글들이 더욱 공감이 갔다. 저자의 문체가 단정적이고 단호 했고 몇가지 객체지향 원칙들은 공감하기 어려운것 들이 였다. 호불호 중에서 불호에 가까운 책이이였다. 그러나 저자가 적어준 원칙대로 코딩할수 있다면 객체지향적인 코드가 될거이라고 생각했다. 2.6 불변 객체로 만드세요. 원칙은 좋은 장점이 많아서 그래도 실무에 생각이다. 이책의 원칙을 벗어난 코드를 짤 경우 더욱 유심해야되는 구나 라고 생각된다. 정적 메소드, 유틸리티 메소드, 가변객체를 실무에서 사용하는 경우가 정말 많은데 최대한 지양하고 좀 더 .. 2022. 2. 4.
1주차 - TDD 해당 포스팅을 하는 이유 그동안 배운 내용들을 정리하면서 복기하여 완전히 내것으로 만들기 위함입니다. 8개의 미션이 있으므로 한개씩 내용을 정리 할 예정입니다. 학습목표 * TDD 기반으로 프로그래밍하는 경험 * 메소드 분리 + 클래스를 분리하는 리팩토링 경험 * 점진적으로 리팩토링하는 경험 과정을 통해 배운 것 TDD란 무엇인가? TDD는 Test Driven Development 이라고 하며 한글로는 테스트 주도 개발이라고 불립니다. 테스트코드를 먼저 짜고 그다음 프로덕션 코드를 짜는 개발 방법론입니다. 실패하는 테스트 코드를 작성하고 -> 테스트가 통과하게만 하는 프로덕션 코드를 작성한다 -> 통과되었다면 프로덕션코드를 리팩토링한다. 해당 싸이클을 반복하여 점진적으로 요구사항 기능을 개발한다. TD.. 2022. 1. 5.
반응형