도메인 주도 설계 (DDD, Domain-Driven Design) 프로젝트 구조 설계하기
1) application 계층
비즈니스 로직을 실행하고, 도메인 모델을 조작하며, 외부 인터페이스와 도메인 간의 중재 역할을 수행한다.
- 외부와 연결되는 service
- 애플리케이션 내부에서만 사용되는 dto (요청/응답 x)
2) domain 계층
애플리케이션의 핵심 비즈니스 로직과 규칙을 포함한다.
ex) model, repository, 핵심 비즈니스 service (외부와 연결 x)
- model
- 인터페이스만 있는 repository (추상화)
3) infrastructure 계층
외부 시스템과의 통합을 담당하며, 기술적인 세부 사항을 처리한다.
- configuration
- domain 계층의 인터페이스를 구현해서 실제 데이터 저장소와의 상호작용을 처리하는 repository (실제 구현체)
4) presentation 계층
사용자 또는 외부 시스템과의 상호작용을 처리하며, HTTP 요청/응답과 같은 인터페이스를 관리한다.
- controller
- request, response (HTTP 요청의 응답의 형태를 표현함)
postgreSQL 환경 변수 설정
db 설정을 환경 변수로 추가해보자.
Edit configuration 으로 들어가서 Modify Options을 누른 후 Environment variables 설정을 해준다.
PostGIS, JPA를 사용해 위도 경도 데이터 다루기
1) PostGIS 설치하기
Application Stack Builder에 접속해서 PostGIS를 따로 설치해준다.
그리고 사용을 원하는 DB에서 PostGIS 확장 기능을 활성화해준다.
2) 인텔리제이에서 설정 추가하고 Point 컬럼 추가하기
먼저 gradle.build에 설정을 추가한다.
// Point
implementation 'org.postgresql:postgresql'
// Point - hibernate-spatial
implementation 'org.hibernate:hibernate-spatial:5.6.11.Final'
다음으로 생성한 위도와 경도를 Point로 저장해주어야 하기 때문에 GeoUtils 클래스가 필요하다.
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class GeoUtils {
public static Point toPoint(double lng, double lat) {
return new GeometryFactory().createPoint(new Coordinate(lng, lat));
}
}
엔티티에는 주소, 생성된 위도와 경도, Point로 변경한 location 정보를 모두 저장해줄 것이다.
이때 postgreSQL에 Point 값으로 저장할 컬럼에 columnDefinition 을 따로 명시해줘야한다.
@Column(columnDefinition = "geometry(Point, 4326)", nullable = false)
private Point location;
+) response에는 복잡한 Point 타입을 같이 보내줄 필요 없이, 위도 경도와 주소만 깔끔하게 보내주면 되겠다고 생각했다.
{
"code": 1,
"msg": "허브가 생성되었습니다.",
"data": {
"hubId": "6c1bc34a-6f45-4020-8a5f-f4128d296656",
"hubName": "테스트 허브",
"address": "임시 주소값",
"latitude": 37.2749264,
"longitude": 126.9994644,
"deleted": false
}
}
'프로젝트 기록 > 백엔드 심화 부트캠프' 카테고리의 다른 글
241218 프로젝트 마무리 회고 TIL (0) | 2024.12.19 |
---|---|
241119 프로젝트 TIL (0) | 2024.11.19 |
241118 프로젝트 TIL (1) | 2024.11.18 |
241115 프로젝트 TIL (1) | 2024.11.15 |
241114 프로젝트 TIL (2) | 2024.11.14 |