전체 글

개발 공부 기록. https://github.com/junseoparkk
Server

[Backend] 외부 시스템 연동, 어디까지 트랜잭션으로 묶어야 할까?

시작하며안녕하세요, 오늘은 외부 API 호출을 트랜잭션 안에서 해도 될까? 라는 주제로 이야기해보려고 합니다. 저는 현재 회사에서 특정 금융 상품의 유지보수 업무를 담당하고 있습니다. 최근 매일 정기적으로 실행되는 가상계좌 반납 배치에 새로운 로직을 추가할 일이 있었습니다. 기존 배치는 가상계좌 만료일을 기준으로 대상을 조회한 뒤, 만료된 건의 신청서 상태를 변경하고 가상계좌를 반납하는 역할을 하고 있었습니다. 여기에 제가 담당하고 있는 특정 금융 상품의 경우, 가상계좌 반납 이후 외부 기관으로 가입취소 전문 전송 로직을 추가해야 했습니다. 처음에는 단순히 기존 로직의 마지막에 전문 전송만 추가하면 되는 간단한 작업이라고 생각했습니다.하지만 막상 구현을 시작하다 보니 한 가지 고민이 생겼습니다. "DB..

Project

[실시간 알림 개선하기] 기능 구현이 전부는 아니니까! (feat. FCM)

시작하며그동안 이런 저런 일로 오랜만에 글을 작성하게 되었는데, 앞으로는 글을 작성하는 스타일이 바뀔 것 같습니다.단순 정보 전달, 개념 정리 보다는 실제로 개발을 하면서 겪었던 문제점, 고민, 개선 스토리 등을 공유하고자 합니다. 해당 시리즈에서는 '우리들의 코스, 우코(Wooco)' 서비스의 알림 기능을 어떻게 개선해 나갔는지를 소개하겠습니다. 'Wooco' 서비스(편의상 '우코' 라고 칭하겠습니다)는 특정 지역에서의 맛집, 카페, 놀거리 등을 하나의 코스로 묶어 공유할 수 있고, 사용자들은 이를 참고해 나만의 일정을 만들어나갈 수 있는 장소 아카이빙 및 공유 플랫폼 입니다. 우코에 대한 자세한 설명은 추후 홍보와 함께 자세히 하도록 하겠습니다. (뜨거운 관심 부탁드려요) 저는 알림 기능 개발을 맡았..

Project

[Project] Spring Boilerplate 시리즈 (3) - 유저 도메인 추가

User Entity유저 엔티티에서 필요한 필드는 무엇일까? 해당 프로젝트에서 중요한 유저 기능은 자체 로그인과 소셜 로그인일 것이다. 따라서 기본적인 유저의 정보(이메일, 비밀번호, 닉네임 등)가 필요하다. 또한 어떤 소셜 서비스를 사용하는지 나타내는 소셜 아이디, 소셜 타입 정도를 추가하면 될 것 같다. 유저 아이디이메일비밀번호이름소셜 타입소셜 아이디 🛠️ 채번 전략그동안 JPA에서 채번 방식으로 Auto Increment 전략을 사용해 PK 값을 지정했다. 여러 전략이 있지만 구현이 간단하고 1부터 시작하여 자동 증가하기 때문에 별 생각 없이 자동 생성 전략을 채택한 것이다. 하지만 여기엔 몇 가지 문제점이 있는데, 해당 글에선 다루지 않고 따로 작성하도록 하겠다. 이외에도 다음과 같은 채번 전략..

Project

[Project] Spring Boilerplate 시리즈 (2) - 프로젝트 세팅

프로젝트 생성 및 의존성 빠르게 프로젝트를 만들기 위해 https://start.spring.io/ 에서 다음과 같이 설정한 뒤 생성했다.초기 개발에 필요한 의존성은 아래와 같다. // build.gradle...dependencies { // Spring Boot implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' developmentOnly 'org.springframework.boot:spring-boot-devtools' // Lombok compileOnly 'org.projectlombok:lombo..

Project

[Project] Spring Boilerplate 시리즈 (1) - 프로젝트 개요 및 요구 사항 분석

개요개발 공부를 하면서 프로젝트를 처음 시작할 때 무엇부터 해야할지 막막했던 경험이 있을 것이고, 나 또한 그랬다. 만약 어디서부터 어떻게 시작해야할지 안다고 하더라도, 이를 처음부터 구현하기엔 꽤 많은 시간과 노력이 들어간다고 생각한다. 나는 이런 번거로움을 줄이고 시간을 절약하기 위해 간단한 보일러플레이트 프로젝트를 시작해보려 한다. 수많은 애플리케이션들은 그 성격에 따라 요구사항도 천차만별일 것이고, 필요한 기능도 모두 다르겠지만, 자주 사용하거나 대부분의 상황에서 공통으로 필요한 기능들이 있다. 예를 들어 기본적인 유저 관리 기능, 로깅이나 응답 형식, 예외 처리 등 말이다. 이러한 것들을 템플릿으로 만들어 효율적으로 개발하고 비즈니스 로직에 집중하기 위해, 다시 한번 초기 세팅부터 배포까지 복습..

Server

[Docker] Spring boot + MySQL Docker로 띄우기

* 해당 글에선 docker-compose 방식이 아닌 직접 터미널에 명령어를 작성하면서 진행하였습니다.1️⃣ Spring boot 프로젝트1) 프로젝트 생성 및 설정https://start.spring.io/ 에서 프로젝트를 하나 생성한다.ProjectProject : Gradle - GroovyLanguage : JavaSpring Boot Version : SNAPSHOT 아닌 최신 버전 (여기선 3.2.3)Packaging : JarJava Version : 17DependenciesSpring WebThymeleafSpring Data JPALombokMySQL Driver build.gradleplugins { id 'java' id 'org.springframework.boot' versio..

Server

[Spring] @ServletComponentScan 동작 원리

1️⃣ 서블릿 등록🔎 @ServletComponentScan스프링 컨테이너에 빈을 등록할 때 '@ComponentScan'을 사용할 수 있다. 서블릿 역시 서블릿 컨테이너에 서블릿을 등록하기 위해선 '@ServletComponentScan'을 사용한다. 애플리케이션을 실행하는 클래스에 붙여 하위 경로에 존재하는 모든 서블릿 클래스를 등록한다. 사실 오늘 서블릿으로 MVC 패턴을 공부하다가 '@WebServlet'을 통해 서블릿을 등록했는데 인식을 못하는 문제가 있었다. 왜그런가 생각을 해보니 서블릿을 나타내는 애노테이션만 넣었을 뿐 이를 서블릿 컨테이너에 등록하는 애노테이션은 넣지 않았기 때문이다. 따라서 서블릿을 인식하지 못하는 문제가 생겼다면 애플리케이션 실행 클래스를 다시 살펴보길 바란다. 다음과..

Server

[Servlet] 서블릿으로 MVC 패턴 구현하기

1️⃣ MVC 패턴 구조 서블릿을 활용해 간단한 MVC 패턴을 구현해보자. 클라이언트가 특정 URL을 호출하면 컨트롤러는 해당 요청을 받는다. 클라이언트가 전달한 데이터를 모델에 담는다. 컨트롤러는 모델을 뷰로 전달한다. 뷰는 모델을 담아 필요한 화면을 클라이언트에게 전달한다. 위 흐름대로 로직을 작성해보자. 또한 컨트롤러는 서블릿 객체를, 모델은 HttpServletRequest 객체를, 뷰는 JSP로 구현할 것이다. HttpServletRequest 객체의 request 내부에는 데이터 저장소가 있다. 여기선 따로 모델 객체를 만들지 않고 이를 활용하자. 모델에 데이터 저장 : request.setAttribute() 모델의 데이터 조회 : request.getAttribute() 먼저 실습에 필요한..

박갈
미 개발 구역