springboot 17

[Project - Howru] (2) ChatRoom Domain 구현

ChatRoom 도메인 구현채팅이 일어날 수 있는 공간(=채팅방)이 필요하다.그래서 이번 포스트에서는 채팅방 생성 및 관리 도메인인 "ChatRoom" 을 먼저 설계하고 구현해보자. 1. ChatRoom 도메인 요구사항채팅방 생성유저 A가 유저 B에게 채팅 요청을 보낼 수 있다. 요청을 보낸경우 채팅방이 DB에 생성된다.채팅방은 항상 "1:1" 구조다 (추후 그룹채팅방으로 확장 가능하도록 Enum으로 구분)B가 수락해야 채팅방이 활성화된다WebSocket 연결용으로 "UUID 기반 방 식별자"가 필요하다사용자가 방과 연결 해제하면 해당 사용자의 ChatRoomMember 레코드를 삭제한다채팅메시지 저장영속/캐시 이중화 전략을 사용하여, 채팅 메시지를 Redis에 최대 30개 저장(추후에 TTL 설정으로 ..

멋사 부트캠프 2025.08.11

[Shop Project] 전략 패턴(Strategy Pattern)을 활용한 결제 방식 구현

문제 정의 및 도입 배경쇼핑몰 프로젝트에서 Customer는 다양한 방식으로 결제할 수 있다.일반 카드 결제포인트 결제쿠폰 할인 결제이러한 다양한 결제 로직을 PaymentService 내부에서 모두 처리하게 되면조건문이 복잡해짐새로운 결제 방식 추가 시 기존 코드를 수정해야 함한 메소드에서 여러가지를 테스트하기 어려움따라서, 전략 패턴(Strategy Pattern)을 통해 결제 방식의 구현을 외부로 위임하여 결제 방식 구현에 확장성을 높이려고 한다.추후에 로그인 방식의 확장도 이 방법을 통해 활용할 수 있을 것 같다. Strategy Pattern을 이용한 다양한 결제 방식 구현public interface Payment { public void pay(int amount, Customer cu..

[Spring] Custom AutoConfiguration 만들어보기

AutoConfiguration이란?Spring Legacy와 Spring Boot의 가장 큰 차이점 중 하나는 설정 방식입니다.  기존의 Spring에서는 XML이나 Java Config를 통해 직접 모든 Bean을 등록해야 했지만,  Spring Boot는 AutoConfiguration을 통해 필요한 Bean을 상황에 맞게 자동으로 등록해줍니다.  Auto-configuration을 사용하고 싶다면 @EnableAutoConfiguration 또는 @SpringBootApplication 어노테이션을 @Configuration 클래스 중 하나에 추가하면 됩니다. 간단한 AutoConfiguration 만들기실제로 나만의 AutoConfiguration 클래스를 만들어보겠습니다. 한국말로 "안녕하세요..

SPRING 2025.04.10

[Spring] MSA(MicroService Architecture) 구현

왜 마이크로서비스를 구현하게 되었는가?기존에는 하나의 Spring Boot 프로젝트 안에 결제, 주문, 인증.인가 등의 기능을 모두 넣는 방식으로 개발을 해왔지만, 실제 서비스에서는 각 도메인을 독립적으로 분리해서 관리하는 방식이 더 일반적이다. 왜 단일 프로젝트가 아닌 마이크로서비스로 구성했는가?단일 모놀리식(Monolithic) 아키텍처는 개발 초기에는 구조가 간단하고 빠르게 구축할 수 있다는 장점이 있다. 하지만 기능이 많아질수록 다음과 같은 문제들이 생긴다:코드베이스가 커져 유지보수가 어려움빌드/배포 시 전체 시스템이 영향을 받음도메인마다 다른 팀이 협업하기 힘듦특정 기능 하나가 문제가 생기면 전체 서비스에 영향을 줄 수 있음반면 마이크로서비스 아키텍처는 각 기능(예: 결제, 주문, 인증.인가 등..

SPRING 2025.04.09

[백엔드 면접 질문 준비] (2) HTTP METHOD에 대해서 설명해 보세요.

HTTP(HyperText Transfer Protocol)는 클라이언트와 서버 간의 통신을 위한 프로토콜로, HTTP 메서드는 이 통신에서 요청의 '의도'를 표현합니다. 즉, 클라이언트가 서버에 "어떻게 해줘!"라고 요청하는 방식을 정의합니다. 주요 HTTP 메서드 소개- GET기능: 서버에서 리소스를 조회합니다.특징: 안전하고 멱등합니다. (요청을 여러 번 해도 결과가 같음)예시: /users/1 → ID가 1인 사용자 정보 조회- POST기능: 서버에 리소스를 생성합니다.특징: 멱등하지 않음. (같은 요청을 여러 번 보내면 데이터가 중복 생성될 수 있음)예시: /users에 사용자 정보 전달 → 새로운 사용자 생성- PUT기능: 리소스를 "전체" 수정합니다.특징: 멱등함.예시: /users/1에 사..

Interview Question 2025.04.02

[백엔드 면접 질문 준비] (1) DI와 IoC에 대해 설명해보세요.

Dependency Injection (의존성 주입)DI(의존성 주입)는 객체의 의존성을 외부에서 주입받는 기법입니다. 의존관계란? 'A가 B를 의존한다' 라고 했을 때, B가 변하면 A에도 영향을 끼치는 관계를 의미합니다. 특정 기능이나 서비스를 외부에서 받아와서 사용하는 방식인데요. DI를 사용하면 클래스 내부에서 새로운 객체를 직접 생성하는 대신 외부에서 필요한 객체를 받아 사용할 수 있습니다. 이를 통해 모듈 결합도를 낮추고 코드 재사용성과 테스트 용이성을 향상할 수 있습니다. 의존성 주입 방법 - 생성자 주입 방식class Eat { private Fruit fruit; public Eat() { this.fruit = new Fruit(); }}위 코드와 같이 E..

Interview Question 2025.03.31

[Project] 복합 키 적용 전후, MySQL 성능 차이 실험 - MySQLWorkBench

복합 키를 쓰면 정말 쿼리 성능이 좋아질까?JPA에서 N:M 관계를 설계할 때, 중간 테이블에 고유 ID(@Id)를 쓸지, 복합 키(@EmbeddedId)를 쓸지는 꽤 자주 마주치는 고민이다.이전 포스팅(복합 키를 사용할 때 주의할 점)에서는 주로 설계적인 장점을 다뤘다면, 이번엔 성능을 실제로 수치화해서 비교해봤다. 실험 배경EduClass에서 ProblemSet(문제집)과 Problem(문제)은 N:M 관계를 갖는다. 이를 위해 중간 테이블 problem_set_to_problem을 설계했는데, 초기엔 단순하게 id를 기본 키로 쓰는 방식으로 구성했다. 하지만 두 가지 문제가 발생했다:중복 등록 방지 불가→ 동일한 문제집-문제 조합이 여러 번 삽입됨조회 성능 저하→ problem_set_id로 검색 ..

EduClass Project 2025.03.25

[Project] 학생 시험 채점 기능 개선 - DTO 활용으로 확장성 높이기

학생이 제출한 답안을 채점하는 기존 방식의 문제점 // 학생 시험 채점 @Transactional public void markStudentTest(Long id, StudentTestMarkRequest request) { StudentTest studentTest = getStudentTestById(id); ProblemSet problemSet = studentTest.getProblemSet(); int score = 0; List answerSet = new ArrayList(); // 해답 problemSet.getProblems().forEach(problem -> answerSet.add(problem.getA..

EduClass Project 2025.03.07

[Spring] JWT(JSON Web Token) 방식과 주의할 점

JWT 의 필요성과 등장 배경JWT는 클라이언트-서버 간의 인증 정보를 안전하고 간편하게 전달하기 위해 고안되었습니다. 특히, 서버가 상태를 관리하지 않는(stateless) 환경에서 확장성과 성능 면에서 큰 이점을 제공합니다. JWT(Json Web Token) 은 통신 정보를 JSON 형식을 사용하여 안전하게 전송하기 위해 사용됩니다. JWT는 토큰 자체에 정보가 포함되어 있는 클레임 기반 토큰입니다. 일반적인 애플리케이션에서 JWT는 주로 인증과 인가를 구현하기 위해 사용됩니다.  JWT의 구조JWT는 헤더, 페이로드, 시그니처로 구분됩니다. 헤더에는 토큰의 암호화 알고리즘이나 타입을 가지며, 페이로드에는 데이터(만료일, 사용자 정보 등)을 가집니다. 시그니처는 헤더와 페이로드가 변조되지 않았는지 ..

SPRING 2025.03.05

[JPA] 영속성 관리(Entity Manager, Entity Factory, Persistence Context)

Entity Manager와 Entity FactoryJPA는 크게 Entity와 테이블을 매필하는 설계 부분과 매핑한 Entity를 실제 사용하는 부분으로 나눌 수 있다.// Entity Factory 생성EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa"); Entity Manager는 Entity를 저장하고, 수정하고, 삭제하고, 조회하는 등 Entity와 관련된 모든 일을 처리하는 관리자이다.// Entity Manager 생성EntityManager em = emf.createEntityManager();Entity Factory는 이름 그대로 Entity Manager을 만드는 공장이다. 공장을 만드는 비용은 상당히 ..

DATABASE 2025.02.16