전체 글
-
@ColumnDefault에 대한 오해Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 5. 7. 21:44
필자는 @ColumnDefault를 사용하는 것이 Insert 쿼리와 관련이 있는 것인 줄 알고 있었으나, 공부해보니 그것이 아니었다.@ColumnDefault는 ddl-auto와 관련이 있는 것으로 ddl이 시작될 때 해당 어노테이션이 사용되는 것이었다.(간단하게 생각하면, 엔티티에 맞는 스키마가 만들어질 때 적용)운영환경에서는 ddl-auto가 validate나 none이기때문에 사실상 해당 애노테이션은 운영환경에서 작동을 하지 않는다.따라서, 본래 목표인 Insert 쿼리를 날렸을 때 해당 컬럼이 default값이 설정되게끔 만들려면 추가적인 설정이 필요하다.@Builder.Default우리가 해야할 추가적인 설정 첫 번째는 @Builder.Default이다.@Builder는 객체의 생성을 쉽고 간..
-
Grafana와 Prometheus를 이용한 모니터링Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 5. 4. 23:21
모니터링은 시스템, 네트워크 그리고 서비스의 상태 및 성능을 지속적으로 감시 및 기록하는 프로세스이다.모니터링 환경을 구축하는 이유가 많겠지만, 필자가 모니터링 환경을 구축한 이유는 시스템의 성능을 추적하기 위해서다. 모니터링 환경을 구축하는 방법을 알기 전에 구성요소들의 개념을 알아야한다. MetricMetric이란 모니터링을 위해 수집되는 측정 항목이나 지표를 말합니다. Metric은 CPU, 메모리 그리고 디스크 I/O 등의 지표는 물론 사용자가 특정 비즈니스 메트릭을 커스텀하게 만들 수도 있습니다. ActuatorActuator는 Spring Boot에서 제공하는 라이브러리로 여러 endpoint를 제공하여 애플리케이션을 쉽게 관리할 수 있도록 도와준다.Atuator의 MicroMeter는 애플..
-
개발용 인프라 구축Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 3. 8. 01:55
새 학기를 맞이하여 개발팀에 AI 개발자 2명과 백엔드 개발자 1명을 새로 영입했습니다. 본격적인 개발을 시작하기 전에, AWS를 활용하여 새로운 개발용 인프라를 구축하기로 결정했습니다. 개발 환경을 고려하여 비용 효율성을 높이기 위해, Private Subnet에 MariaDB 서버를 배치하는 대신, 하나의 EC2 인스턴스에 여러 컨테이너를 배포하는 방식을 선택했습니다. 구체적으로, docker-compose를 사용하여 한 대의 EC2 인스턴스에 1개의 Nginx, 2개의 웹 애플리케이션 서버(WAS), 그리고 MariaDB와 Redis를 함께 올렸습니다. 이렇게 함으로써, 개발 환경을 효율적으로 관리하고 비용을 절감할 수 있게 되었습니다. 해당 인프라의 요청 흐름은 대략 아래와 같습니다. 외부..
-
헥사고날 아키텍처 회고 (1)Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 2. 12. 20:41
EATceed 프로젝트에서 헥사고날 아키텍처를 사용해보며, 고민해본 점을 서술해보려고 합니다.먼저, 헥사고날 아키텍처를 도입한 이유입니다. 헥사고날 아키텍처를 도입한 이유 계층형 아키텍처는 데이터베이스 주도 설계를 유도 계층형 아키텍처는 엔티티를 비즈니스 모델처럼 사용해 도메인 로직뿐만아니라, 즉시 로딩/ 지연 로딩 트랜잭션 등등 영속성 관련 작업을 한 번에 처리하여 관심사의 분리가 제대로 되지 않았습니다.따라서, 이번 프로젝트의 핵심 도메인은 "식사"관련 도메인들은 엔티티에 비즈니스 로직을 넣지 않고, 영속성과 도메인을 명확히 분리하여, 도메인 주도 설계를 하고자 하였습니다.이렇게 함으로써 스키마에 변경이 생겼을 때 이것이 도메인 로직에 영향을 받지 않아 프로젝트를 진행하며 스키마 변경이 비교적 수월하..
-
리버스 프록시(Reverse Proxy) 설정Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 1. 22. 15:57
필자가 구성해야할 구조는 하나의 EC2에 2개의 WAS가 있는 구조이다.해당 구조로 설정한 이유는 2개의 WAS 중 1개가 매우 가벼워 굳이 1개의 EC2를 더 띄울 필요가 없었기 때문이다.따라서, 2개의 WAS의 라우팅이 필요하여 리버스 프록시를 이용하기로 하였다. 참고 : 리버스 프록시클라이언트의 요청을 대신 받아 내부 서버로 전달해주는 것을 리버스 프록시라고 한다.장점- 보안 : 모든 요청은 Reverse Proxy에 들어오며, 사용자는 내부 서버의 존재를 모른다. 오직 Reverse Proxy만이 내부 서버를 알고 있다.- 로드 밸런싱 : Proxy 서버가 로드 밸런싱 즉, 부하 여부에 따라 요청을 분배할 수 있다.- 캐싱 : 미리 렌더링된 버전의 페이지를 캐시하여 페이지 로드 시간을 단축할 수..
-
DNS(Domain Name System)스터디/Web 2024. 1. 21. 20:08
DNS란?? DNS는 Domain Name System의 약자로, IP 주소와 도메인 주소를 연결해주는 시스템이다. 예를 들어, IP 주소가 44.342.03.244이고, 도메인 주소가 www.eatceed.com 이라고 하자. 해당 IP 주소와 도메인 주소가 관계가 있다는 것을 알려주는 시스템이 있어야한다. 사용자는 IP 주소가 무엇인지 일일이 외울 수 없다. 따라서, 도메인 주소를 검색하면 DNS에 해당 도메인 주소와 IP 주소가 매핑되어 있기 때문에 사용자가 IP 주소를 몰라도 도메인 주소를 통해 해당 IP에 접근할 수 있는 것이다. 예시를 그림으로 나타내면 아래와 같다. 먼저, 사용자가 www.exceed.com 으로 요청을 하면, DNS에서 도메인 주소와 매칭되는 IP 주소를 반환한다. 웹은 해..
-
Spring에서 Execption을 핸들링하는 방법스터디/Spring 2024. 1. 15. 21:07
서비스를 만들면서 예외 처리는 정말 중요합니다. 이번 포스팅에서는 Spring Boot에서 예외를 어떻게 핸들링할 수 있지에 대해서 알아보겠습니다.예외를 처리하는 방법은 @ExceptionHandler 사용, HandlerExceptionResolver를 사용, @ControllerAdvice 사용 이렇게 3가지가 있습니다.Controller - level : @ExceptionHandler Spring Boot에서 예외를 처리하는 방법 중 하나는 Controller의 메서드 위에 바로 @ExceptionHandler를 사용하는 것입니다.public class FooController{ //... @ExceptionHandler({ CustomException1.class, Custo..
-
[Spring Security] @AuthenticationPrincipal을 커스텀 해보자(Feat : ArgumentResolver)Project Trouble Shooting/[EATceed] 몸무게 증량 어플 2024. 1. 11. 00:08
문제 발생 필자는 보통 개발할 때, 시큐리티보다는 다른 기능들을 먼저 개발한 후에 시큐리티를 기능을 입히는 것을 선호한다. 이번 프로젝트 역시 위와 같이 진행했다. 기존 코드는 @AuthenticationPrincipal을 이용해 Authentication을 구현한 UsernamePasswordAuthenticationToken의 Principal인 MemberDetails에서 memberId를 조회하고 있다. @GetMapping("/meal") public ApiResponse getMeal(@AuthenticationPrincipal MemberDetails memberDetails) { Long memberId = memberDetails.getMemberId(); getMaintainMealUs..