본문 바로가기

전체 글137

자바 프록시 패턴 설명 및 왜 사용해야하는지 Proxy를 번역하면 대리자 입니다. 즉 프록시 패턴이란 어떤 객체의 접근을 제어하는 대리 객체를 제공하여 다양한 선행처리(접근제한, 캐시 등)을 이용하는 패턴입니다. 대리(Proxy)객체는 부모객체를 상속받고 위임도 받아서 사용합니다. 예시 ride()메서드를 가진 자전거를 간단하게 객체 생성하고 ride를 실행해보는 작업을 진행해보겠습니다. 먼저 타다 라는 메서드를 지닌 자전거 인터페이스가 있습니다. public interface Bicycle { void ride(); } 자전거는 구현체를 지니고 있는데요. 다이아몬드백이 자전거의 구현체입니다. public class DiamondbackBicycle implements Bicycle { @Override public vo.. 2022. 11. 1.
자바 빌더 패턴 빌더 패턴 이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴입니다. 생성패턴 중 하나로 빌더 패턴의 장점은 생성패턴 객체의 인스턴스생성과정을 추상화, 객체생성과 참조과정을 캡슐화하여 → 객체 생성/변경이 프로그램 구조에 영향을 받지 않도록함 → 결국 프로그램 유연해집니다. 스프링에서 사용 예시 대표적인 예시로 spring-security가 있습니다. docs의 example을 보면 HttpSecurity, UserDeatails객체를 build하여 만들고 사용합니다. HttpSecurity (spring-security-docs 5.7.4 API) HttpSecurity (spring-security-docs 5.7.4 API) Al.. 2022. 10. 30.
자바 팩토리 메서드 패턴 설명 팩토리 메소드 패턴은 객체를 생성할 때 어떤 클래스의 인스턴스를 만들지 서브 클래스에서 결정하게 합니다. 즉, 인스턴스 생성을 서브 클래스에게 위임합니다. 객체를 생성하는 공장 클래스를 만들어서 생성의 역할을 가지는 클래스를 만드는 것이 핵심! 또한 자식 팩토리 클래스에 구현을 하여 결정합니다. 왜 사용해야 하는지 팩토리 패턴을 사용하는 이유는 객체를 생성하는 역할을 분리하겠다는 취지가 담겨있습니다. 객체의 생성 코드를 별도의 클래스/메서드로 분리함으로써 객체 생성의 변화에 대비하는데 유용합니다. 예시 먼저 추상객체로 피자가 있습니다. 이 피자의 종류로 구현객체인 씨푸드피자, 베이컨피자, 치즈피자가 있습니다. import java.math.BigInteger; public abstract class.. 2022. 10. 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.
함께 자라기를 또 읽고 나서 최근 지인이 함께 자라기 책을 읽은 후기를 가볍게 나누는 스터디를 모집 중이였고 관심이 생겨 참여 했습니다. 작년즈음에 함께 자라기를 읽은 적이 있습니다. 스터디를 꼭 참여 할 필요는 없었지만 상기하고자 한번 읽으려고 합니다. - 머릿말 중에서 스스로 변하고 싶지만 계속 실패하는 사람, 혹은 조직을 개건하기 위한 시도를 하다가 오히려 데어본 사람, 하루하루가 답답한 사람들을 위해 이 책을 썻습니다. 머릿말을 다시 읽으니 지금이 이책을 보기 적합한 시기인거 같습니다. 자라기 상반된 의견과 정보 속에서 스스로 생각하는 훈련을 해나가야 한다. 현실에서는 야생학습이 중요하고 더 많이 필요합니다. 어떤 경우에 야생학습이 필요할까요? 일반적으로 불확실성이 높은 경우일수록 중요합니다. 불확실하고 목표가 불분명한 것이.. 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.
반응형