본문 바로가기

프로그래밍106

만들면서 배우는 클린아키텍처 => 엔티티와 도메인의 분리 얼마전 만들면서 배우는 클린아키텍처 책을 봤다. 사실 예전에도 본적이 있는데 그때는 서평을 적지 않았다. 저는 책 내용을 정리하는게 아니며 다른 개발자분들이 정리한 블로그글이 있으니 참고하면 됩니다. 한가지 가르침을 받아서 내용을 정리하려고 한다. 엔티티와 도메인의 분리 그동안 업무와 공부를 하며 엔티티와 도메인을 분리해본적이 없다. 엔티티에 직접 비즈니스 코드를 채우고 서비스가 적절히 호출하여 만든 api가 다수였다. 예를 들어 Q&A 서비스를 만든다는 가정하에 간단한 질문테이블과 엔티티(question)를 코드이다. @Entity @Table(name = "question") public class Question extends BaseTimeEntity { @Id @GeneratedValue(st.. 2024. 3. 6.
Mysql Docs 맛보기 최근 공부로 Real MySql을 읽고 있었다. 문득 이런 생각이 들었다. "java, spring docs는 많이 보는데 mysql docs를 왜 한번도 안봤을까?" 그렇다 RealMySql 책에서도 레퍼런스로 dev.mysql이 있었지만 찾아보지 못했다. 아니 안할걸지도.. 개발자로써 부끄러운 일이지만 이제라도 Mysql Docs를 보려 한다. 같이 찍먹해보자! dev.mysql.com으로 접속하면 Reference Manual 로 접속한다. 필요한 부분을 검색해서 Docs를 살펴본다. 난 최근 옵티마이저가 궁금하니 찾아봐야겠다. mysql docs에서는 쿼리 최적화에 대한 고려 사항을 꽤나 디테일하게 알려 준다. 인덱스를 추가 할 수 있는지 여부를 확인해보기, 인덱스는 검색 속도를 높여준다. 오래 .. 2023. 7. 31.
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.
4장: 부호화의 발전 부호화란? 어플리케이션에서는 메모리에 데이터를 저장할 때 객체, 구조체, 배열 등의 구조로 저장한다. 보통 CPU가 효율적으로 접근할 수 있도록 ‘포인터'를 사용하는데, 이는 다른 언어를 사용하는 프로세스에서는 이해하지 못할 수 있다. 그러므로 데이터를 파일에 쓰거나 네트워크로 전송하려면 바이트 형태로 저장한다. 부호화: 인메모리 → 바이트 (직렬화, 마샬링) 복호화: 바이트 → 인메모리 (역직렬화, 언마샬링, 파싱) 정리하면, 데이터 부호화는 통신 주체(프로세스 또는 서버)가 다른 언어의 데이터 구조를 사용해도 상대 프로세스가 이해할 수 있도록 데이터를 전환하는 것을 말한다. 더 쉽게 말하면 어플리케이션 환경에 구애받지 않는 데이터 형식으로 전환하는 과정을 말한다. 데이터 부호화, 왜 알아야 하는가 데.. 2022. 12. 26.
자바 커맨드(Command) 패턴 설명 커맨드 패턴은 요청을 객체의 형태로 캡슐화하여 사용하는 패턴입니다. 객체의 행동을 변화시키는 요구나 명령을 클래스로 표현하는 패턴입니다. 왜 사용해야 하는지 다양한 요청을 안전하게 처리할 수 있다. 각각의 커맨드들은 특정 객체에 의존하지 않도록 만들어지므로 재활용성이 매우 높습니다. 예시 저희는 이제 리모컨을 만들어 보겠습니다. 리모컨에는 4개의 버튼과 4가지 기능이 있는데요. 우선 커맨드를 인터페이스로 정의해보겠습니다. public interface ButtonCommand { public void run(); } 그다음 4가지 버튼의 기능을 만들어 보겠습니다. public class PowerOnButton implements ButtonCommand { @Override public void .. 2022. 12. 12.
2장:데이터 중심 애플리케이션 설계 이번 챕터를 읽고 얻고 싶은 목표 어플리케이션 개발자로써 적합한 데이터 모델을 선택 할때 도움을 얻고 싶다. 다양한 범용 데이터 모델 역사적으로 데이터 모델이 많이 생기고 사라졌지만 현대에 주로 사용하는 데이터 모델은 3가지 입니다. 관계형 데이터베이스 문서 데이터베이스 그래프 데이터베이스 그리고 각 데이터 베이스는 장단점이 있고 각각의 특화된 질의언어(Query Language)를 가지고 있습니다. 관계형 데이터베이스 오늘날의 가장 잘 알려진 데이터 모델 : 1970년 에드가 코드(Edgar Codd)가 제안한 관계형 모델이다. 관계형 데이터베이스의 근원은 비즈니스 데이터 처리에 있다. 트랜잭션 처리와 일괄 처리 등등을 할수 있다. 문서 데이터베이스 NoSQL은 관계형 모델의 우위를 뒤집으려는 가장 최.. 2022. 12. 12.
1장:데이터 중심 애플리케이션 설계 데이터 중심 애플리케이션 설계 책을 읽고 정리하였습니다. chapter 단위로 내용을 정리해서 올릴 예정입니다. 서문 급격한 기술 변화에도 변하지 않는 원리가 있다. 이 원리는 사용하는 도구의 버전과도 상관이 있다. 이 책은 성공적인 데이터 시스템을 예로 들어 여러 유명 애플리케이션의 기반 기술을 설명하고 서비스 환경에서 확장성과 성능, 그리고 신뢰성 요구사항을 항상 충족하기 위해 사용하는 기술을 설명한다. 데이터 시스템의 동작 방식뿐만 아니라 왜 그런 식으로 동작하며 어떤 질문을 해야 하는지를 알아본다. 이 책을 다 읽고 나면 특정 목적에 어떤 기술이 적합한지 결정하는 능력과 좋은 애플리케이션 아키텍처의 기반을 만들기 위해 도구를 조합하는 방법을 이해하는 능력이 생긴다. 이 책에서 다루는 내용 데이터 .. 2022. 12. 6.
자바 데커레이터(Decorator) 패턴 설명 Decorator 뜻은 장식으로 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴입니다. 객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴입니다. 왜 사용해야 하는지 상속을 통한 기능의 확장은 각 기능별로 클래스를 추가해야하는 단점이 있습니다. 각 추가 기능별로 개별적인 클래스를 설계하고 기능을 조합할 때 각 클래스의 객체 조합을 이용하면 됩니다. 그리하여 이 설계는 추가 기능의 수가 많을수록 효과가 좋습니다. 예시 까페 레시피를 프린트하는 프로그램을 만들어 보겠습니다. 먼저 커피 재료를 리턴하는 메서드를 지닌 인터페이스를 만듭니다. public interface Coffee { String recipe(); } 그다음 커피데코레이터 추상클래스를 만듭니다.(커피.. 2022. 11. 15.
자바 전략 패턴 설명 및 왜 사용해야 하는지 알고리즘을 클래스화해서 객체의 행동을 쉽게 변경할 수 있는 패턴입니다. 실시간으로 객체의 행동을 변경해야 할 필요가 있을때 사용합니다. 전략의 수정과 추가에 따른 클라이언트의 의존성을 제거하여 전략을 쉽게 변경 할 수 있습니다. 실시간으로 전략을 선택하여 객체의 행동을 변경 할 수 있습니다. 예를 들어서 포토샵에서 작업한 이미지를 여러 포맷(jpg,gif,png)로 저장할때 게임 캐릭터의 공격무기를 다양하게 선택 할때 입니다. 예시 저희는 이제 포토샵 개발자가 되었습니다! 포토샵에서 이미지를 저장할때 pdf, jpg, 클립보드 등 다양한 포맷으로 저장을 하게 하는데요. 저장 방식을 전략패턴으로 한번 코딩해보겠습니다. 우선 추상클래스로 Image가 있습니다. public abs.. 2022. 11. 3.
자바 프록시 패턴 설명 및 왜 사용해야하는지 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.
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.
반응형