[DDD] 2. DDD의 아키텍쳐
·
Back-End/DDD
일반적인 아키텍쳐 4가지의 계층으로 나누어져 어플리케이션을 구성한다. 표현 계층(UI)는 응용 계층을 위해 정보를 가공한다. 응용 계층은 도메인 계층을 가지고와 메소드를 호출한다. 응용 계층은 데이터의 저장을 위해 인프라스트럭쳐에 의존한다. 일반적으로 상위 계층이 하위 계층에 의존하는 구조를 가지고 있다. 이전 포스트에서 도메인 영역에서 도메인 핵심 규칙을 구현한다고 하였는데, 구현한 기능을 누가 사용하고 누가 관리할까? 바로 응용 계층이다. 스프링을 한참 공부하면서 Controller, Service, Repository 컴포넌트들의 역할을 무엇이고 왜 나누어져있는지 궁금했다. 맨땅에 박치기 방식으로 개발을 하다보니 Controller는 Service에서 사용할 데이터 가공, Repository는 Se..
[DDD] 1. 도메인 모델 시작하기
·
Back-End/DDD
도메인이란? 다시, 도메인의 정의는 무엇일까? 도메인은 개발자가 구현으로 해결하고자 하는 문제 영역이다. 개발을 하기 앞서, 기획과 기능을 정한다. 이는 개발자가 직접 정할수도있고, 또는 기획자나 stakeholder에 의해 정해질 수 있다. 도메인은 이들이 공통적으로 집중할 수 있는 소통창구 역할을 한다. 도메인 모델 패턴 일반적인 어플리케이션의 아키텍쳐는 다음과 같다. 표현(UI) 사용자의 요청 처리 응용(Service) 사용자가 요청한 기능 실행, 비즈니스 로직을 직접 구현하지 않고 도메인 계층을 조합하여 기능을 실행 도메인 도메인 규칙 구현 인프라스트럭쳐 DB나 MQ같은 외부 시스템과의 연동을 처리 도메인 계층은 도메인의 핵심 규칙을 구현한다. 도메인의 핵심 규칙은, '출고 전에 배송지를 변경할 ..
[DDD] 0. DDD 시작하기
·
Back-End/DDD
DDD란 무엇일까? Domain Driven Design, 도메인 주도 개발이라는 뜻이다. 일반적인 백엔드 서버 개발은 DB와 뗄 수 없는 구조이다. 오히려 서버 로직 구성보다, DB 테이블 설계와 객체 생성에 더 시간을 많이 쏟는다. DDD는 도메인 모델이라는 키워드에 집중해, 어플리케이션 구성을 더 효율적으로 하는 일종의 방법론이다. 까지가 내가 아는 전부이다.... 주변 백엔드 개발자로부터 DDD를 공부해보라는 추천을 받아서 이번 기회에 공부하려고 한다. 학교 도서관에서 우연히 다음과 같은 책을 발견해서 얘로 결정!
포트 없이 도메인 접속하기
·
Back-End
리액트 앱을 빌드하게 되면 기본 포트로 3000이 할당된다. my-hompage.com:3000 으로 접속해야 내가 빌드한 리액트 앱의 화면이 나오게 된다. Spring은 기본 포트가 8080으로 할당이 되므로 Rest API를 호출할때면 my-server.com:8080/api 이런식으로 호출해야 한다. 이때 포트번호를 생략하게 되면 당연히 해당 프로세스를 찾지 못해 Http 통신이 불가능하다. my-hompage.com 혹은 my-server.com/api 이런 형태로 Http 통신을 하고 싶다면 어떻게 해야 할까? 기본적으로 Http 통신은 80 포트를 통해서 하게 된다. 그러므로 주소창에 naver.com을 입력해 얻는 결과는 사실 naver.com:80을 입력해 얻는 결과이다. 따라서 우리는 다..
EC2에서 git private repository 접근하기
·
Back-End
EC2에서 나의 private repository를 Clone / Pull / Push 하기 위해 다음과 같은 명령어를 입력하면 remote repository를 찾을 수 없다고 나온다. 이는 repository에 접근하기 위한 id_rsa.pub 키가 remote에 등록되지 않아서이다. ssh-keygen -o -t rsa -b 4096 -C "이메일" 명령어로 keygen을 해준다. ls- a 명령어로 .ssh 폴더를 확인해준다. 이후 생성된 id_rsa.pub 파일을 에디터로 열어준 다음 내용을 복사한다. 내 repository setting에 복사한 key를 추가하면 끝!
[JPA] 7. 값 타입
·
Back-End/JPA
JPA의 데이터 타입 JPA의 데이터 타입은 Entity 타입과 값 타입, 2가지로 나뉜다 Entity 타입은 기존에 @Entity Annotation으로 수식해주는 객체이고, Id를 가지고 있어 직접 DB 테이블에 매핑된다 값 타입은 int, Integer, String 처럼 단순히 값으로 사용되는 자바 기본 객체를 칭한다 엔티티에 속하므로 생명주기는 엔티티에 의존하게 된다 @Entity public class Member { private String text; // Member가 사라지면 당연히 text도 사라진다! } 임베디드 타입 값 타입에는 기본 값 타입 이외에도 임베디드 타입(복합 값 타입)이 있는데 프로그래머가 새롭게 정의한 객체라고 생각하면 된다. 예를들어 Member가 다음과 같은 필드..
[JPA] 6. 프록시와 Cascade 및 고아 객체
·
Back-End/JPA
프록시 프록시 패턴에서 나오는 그 프록시이다 프록시란 원래의 객체 인스턴스를 상속받는 새로운 클래스를 칭한다 왜 프록시가 필요한지 생각해보자 Persist Context에서 객체를 EntityManager.find()로 가져올 때, 만약 객체가 다른 객체를 레퍼런스로 가지고 있다면 해당 객체까지 SELECT 쿼리가 나갈 것이다. public class Member { private Long id; private Team team; } public class Team { } public static void Main(){ Member member = new Member(); member.setId(1L); EntityManager.persist(member); EntityManager.flush(); En..
[JPA] 5. 상속관계 Mapping & Mapped Superclass
·
Back-End/JPA
상속관계 Mapping 계속해서 DB와 OOP의 패러다임 문제가 발생하는데, 이번에는 상속문제이다 OOP는 상속을 중요시하기에 언어적으로 완벽히 지원해준다 하지만 RDB는 상속을 일부 지원하긴 하지만 완벽히 지원해주지 않는다 대신 슈퍼타입과 서브타입이란걸 지원해주는데 JPA는 이 상속문제를 해결하는 3가지 전략을 제공한다 조인 전략 단일 테이블 전략 구현 클래스마다 테이블 전략 부모 클래스에 다음과 같은 Annotation을 붙여주면 된다 @Entity @Inheritance(strategy=InheritanceType.XXX) public class Parent { } @Entity public class Children1 extends Parent{ } 따라서 테이블 전략을 바꾸더라도 전체 코드를 바..
[JPA] 4. Entity간의 연관관계 Mapping
·
Back-End/JPA
연관관계 JPA에 의해 관리되는 Entity들의 실제 DB Table에서, Join Query를 통해 연관관계가 필요한 Table이 있다. Foreign Key를 통해서 Join을 한 다음에 연관관계를 맺어주는데, (RDB에서는) JPA에서는 이런 관계를 어떻게 맺어줄 수 있을까? 실제 테이블에 맞춰보기 Member는 Team에 소속될 수 있다 현재 자신이 속한 Team을 DB에 저장하기 위해, Team의 PK인 TEAM_ID를 자신의 FK로 가지고 있다 Table 구조상 문제될건 없지만, 객체 구조가 저렇게 된다면 JPA를 쓰는 목적에 어긋나게 된다 우리는 처음에 객체지향적으로 DB를 사용하고 싶어서 JPA를 쓴 것이었다 Member가 속한 Team을 찾고 싶다면 다음과 같이 코드를 작성할 것이다 Me..
[Spring Boot] Spring 기본 정리
·
Back-End/Spring Boot
Spring 기본 정리 김영한님의 스프링 기본편을 완강하고, 전체적으로 배운 내용을 내멋대로 정리하는 포스트 나중에 스윽 다시 읽어보려고 최대한 개념위주로 정리하고, 알고있었던 것은 제외했다. SOLID 5대 원칙 디자인 패턴 글이 아니므로 스프링과 관련된 원칙만 쓰겠다 OCP(Open-Close Principle) 코드는 확장에는 열려있어야 하고 변경에는 닫혀있어야 한다. 무슨 말인지 맨 처음에 이해가 안됐지만 결국에는 구현체에 의존하지 말고 추상체에 의존하라 이 말이었다. 구현체에 의존해 해당 구현체에만 존재하는 메소드를 사용하는 방식 말고, interface를 적극 활용해 혹시 모를 확장에 유연하게 대처하는것이 좋다. DIP(Dependency Injection Principle) 위에서 의존하는 ..