본문 바로가기

분류 전체보기

(46)
레이어드 아키텍처 (Layered Architecture) feat. DDD *상위 문서: 코드 리뷰: 불완전한 객체에서 나타난 문제들A. 레이어드 아키텍처(Layered Architecture) 란     레이어드 아키텍처는 소프트웨어 시스템을 여러개의 “논리적인 계층”으로 나누어 사용하는 설계 방법 입니다. 논리적으로 계층을 나누는 것은 ‘관심사의 분리’(Separation of Concerns)를 달성하기 위함으로 이를 통해 각 계층의 책임 범위를 제한합니다. 이러한 조치는 각 계층의 응집도를 높이고 서로간 결합도는 낮추어 계층간 일관성 있는 책임과 역할을 확실히 하여 유지보수와 변경에 유연한 소프트웨어를 설계할 수 있습니다.      관심사를 계층별로 분리를 하였지만, 소프트웨어가 응답을 하기 위해서는 각 계층 간의 협력이 필요합니다. 레이어드 아키텍처에서는 협력을 하면서..
레이어드 아키텍처가 아닌 것들 *'레이어드 아키텍처' 에서 이어지는 아티클입니다. A. N-tier 아키텍처.      N-티어 아키텍처는 종종 n-레이어드 아키텍처와 혼동되어 논리적인 부분을 나누는 아키텍처를 설명할 때 쓰이기도 하지만 엄밀히 따지면 n-티어 아키텍처는 논리적인 모듈이 아닌 "컴포넌트들을 관심사별로 '물리적'으로 독립된 모듈로 나누어 관리하는 아키텍처" 입니다. N-티어 아키텍처는 논리적인 분할에 집중하는 레이어드 아키텍처보다 물리적인 시스템 레벨의 아키텍처를 설명하는데 사용됩니다.    또한, N-티어 아키텍처는 CS의 특정 분야에서 쓰이는 용어가 아닌 "물리적 모듈로 분리"라는 개념적인 용어로 소프트웨어 아키텍처의 여러 상황에서 쓰일 수 있고 어떤 상황에서 쓰이냐에 따라 각 티어가 어떤 것을 말하는지 조금씩 달라..
코드 리뷰: 불완전한 객체에서 나타난 문제들 A. 개요    JPA에 익숙 해져가며 가며 도메인 주도 개발(DDD, Domain Driven Development)도 조금 배워가던 몇 달 전 아직 DDD와 객체지향 (OOP, Object Oriented Programming)에 관련된 원칙을 따르는 코드를 만드는 것이 아직 어색해서 인지, 코드 리뷰 중 몇가지 취약점이 있을 수 있을 코드가 발견되었습니다.  여기에는 여러가지 이슈들이 있어서 하나씩 풀어 보려고 합니다. B. 문제가 되던 부분 들과 코드 작성의 이유들// 문제의 코드 public static Progress from(ProgressRegisterForm form) { Help help = Help.createEmptyHelpWithOnlyId(form.getHe..
캐싱을 도입했다가 철회한 경우들. 프로젝트를 진행하면서 캐싱을 도입했다가 캐싱을 효과적으로 사용하지 못한다고 느껴서 철회한 경우가 있어서 정리를 하며 캐싱을 도입하는 이유에 대해 고찰을 해보자고 합니다.  A. 첫번째 경우:   Redis  -> DB    1. 캐시 사용의 이유  프로젝트에서 필요한 가게 관련 데이터를 Kakao API의 DB에 의존하는 특성상 데이터를 관리할 수 없습니다.그래서 관련 데이터를 DB에 저장하여  관리하기보다는, 가게 검색시 카카오 API 요청으로 받는 가게 정보를 일시적으로 캐싱해 재검색시 API 요청을 줄여 성능 향상및 API 요청에 대한 비용을 줄이려고 했습니다.2. 프로젝트 변경그렇지만, 이후 가게 사장님이 직접 가게 정보를 추가할 수도 있게 서비스가 변경되면서 프로젝트의 DB에 저장된 정보와 캐싱..
DDD 관점에서 연관관계 *상위 문서: 코드 리뷰: 불완전한 객체에서 나타난 문제들*데이터 모델링이나 메모리가 아닌 DDD의 모델링 관점에서 연관관계에 관한 글입니다. (맨 아래 추가 1 참조)A. 개요    한창 JPA를 사용하면서 엔티티끼리 서로를 가지는 연관관계로 모델링을 하는 방법에 익숙했습니다. 그러나 DDD를 관해 공부하고 토론하며 에그리거트 간의 경계를 지키기 위해서는 서로 다른 에그리거트의 경우 약한 참조로 구성하는 것이 좋을 수도 있겠다 생각이 들어 엔티티의 연관관계에 대해 알아보기 위해 내용을 정리해 보았습니다.  * 애그리거트(Aggregate): 하나의 비즈니스 트랜잭션 일관성의 경계로 단일 트랜잭션에서 같은 비즈니스의 규칙과 제약에 따라 같이 변경되는 범위.'로그인', '회원가입'처럼 논리적인 개념으로 하..
안정성을 더하는 불변객체 *상위 문서: 코드 리뷰: 불완전한 객체에서 나타난 문제들A. 불변 객체란   불변 객체는 객체 생성 이후 내부 상태가 변하지 않는 객체입니다. 값이 변해야 한다면 새로운 객체 만들어 리턴하고, 참조에 의해 가변될수 있는 필드가 있다면 getter시 방어적 복사(defnesive-copy)를 통해 제공하며, 가변 가능한 객체를 인자(parameter)로 받게 될 때 또한, 방어적 복사로 받아서 사용합니다.    OOP에서 객체들이 일관성을 가지고 협력하기 위해서는 객체의 신뢰성이 중요합니다. 요청을 했을때, 기대했던 대로 일관적으로 동작을 하려면, 객체의 필드는 예상치 못하게 변화하면 안됩니다. 객체의 불완전한 상태와 가변상태 모두 예상치 못한 값을 리턴할 수 있기에 신뢰를 잃게 되고 이러한 객체들의 협..
객체는 불완전하게 사용 되면 안된다. (일관성 지키기) *상위 문서: 코드 리뷰: 불완전한 객체에서 나타난 문제들A. 불완전한 객체를 사용하면 안되는 이유. 1. 객체의 일관성이 없어져서 믿고 사용하기 어려워 집니다.     불완전한 객체의 존재가 가능해졌기 때문에 현재 객체가 어떤 상태일지 짐작하기 어려워 질 위험에 처했습니다. 그나마 setter를 public 하지 않게 사용한다면 Null Pointer Exception (NPE)가 예상치 못하게 생길 수 있을 수 있는 정도로 조금 더 문제의 범위가 줄어 들수 도 있지만, 예상을 할 수 없다는 것은 이미 객체간 협력에서 맡은 책임을 정확히 할 수 없다는 것입니다.     일관성이 없는 객체는 객체간 협력에서 맡은 바를 하기 힘들어져서 재사용하기가 어렵습니다. 결국 모델링된 설계대로 객체는 동작하지 않고 ..
로드 밸런싱, 하다보면 결국 MSA하고 싶어지지 않을까? 1. 소개AWS로 트래픽이 늘어나는 상황을 가정해 배포를 하다 보니 자연스럽게 로드밸런싱을 사용했었습니다.  예제들을 따라하다 보면 방법론에 치우칠 때가 있는데 왜 하게 되는지 잘 모르는 것 같아서 로드밸런싱이 어떤 건지 설정하는 법 이상의 "왜"에 대해 고민을 해보고 싶었습니다. 로드밸런싱에 대해 고민하다보니까 MSA를 사용하는 많은 이유들이 있겠지만 "이런 이유에서 나중에는 MSA까지 쓰고 싶어지지 않았을까?" 라는 생각이 드는 부분도 생기는 군요. 확실히 요즘은 글로 표현을 하는게 개인적으로 공부도 더 하게 되고 좀 더 깊게 파보게 되는 것 같습니다. 하나씩 풀어가 보겠습니다.  *본 포스트는 사용법에 대해서 다루지 않으려고 합니다. 혹시 필요하신 분들을 위해 사용법은 도움 받은 링크들로 대체하였..
자바, 스프링 내부망 통신 1편: 서버간 통신에 쓰일 라이브러리 1. 소개기본적인 멀티스레드/블록킹 환경에서의 Http 요청에 대해 다루어 보려고 합니다. MSA구조를 배워가면서 스프링 환경에서의 서블릿을 이용한 통신 이외에 자연스럽게 서버간 내부 통신에 대한 니즈가 생겼고 다양한 Http Connection 방법들이 있어서 각자의 특징과 쓰임을 분석해보려고 작성하였습니다.  기술들이 생겨나며 보여지는 특징은 각 기술들의 추상화 수준입니다. 특히 저수준에서 고수준으로 올라가면서 기술의 영역에서 비즈니스 영역으로 차츰 추상화 하는 방식으로 진화해왔습니다.  2.  기술의 진화A. URL Connection:  자바 1.0 초기부터 있었던 가장 기본적인 레벨의 URL Connection입니다. Http로 특정 되지 않았기에 URL의 주소를 FTP등으로 바꾸어 다른 프로토..
JEP 122: 자바 Perm Gen이 사라지고 MetaSpace로 옮겨 집니다. 1. 서론 자바 공식문서 링크: https://openjdk.org/jeps/122 Perm Gen이 자바 8부터 Metaspace영역으로 변경 되어 Native 영역으로 옮겨 졌다는 부분을 공부하는데 static 영역에 관련되서는 GC로 관리된다 또는 Native 영역이라 아니다등 명확한 정답을 얻기 어려웠습니다. 이에 개인적으로 좀 더 조사를 하게 되었고 잊지 않기 위해 기록을 해 보기로 하였습니다.   2. 자바 런타임 메모리 영역A.  스레드관련 메모리: 스레드 영역은 스레드의 시작과 종료를 같이 함으로 메소드나 스레드 호출과 함께 생성 되며 스레드 종료 시 사라집니다.  - Java Stack (자바 스택 프레임) : 지역변수, 매개변수, 메소드 호출정보 (함수 정보), 반환 주소등.- PC R..