Backend 54

Spring - WebSocket + STOMP

안녕하세요. 오늘은 Spring Boot WebSocket 그리고 STOMP에 대해 알아볼게요. WebSocket이란? WebSocket은 하나의 TCP 연결 위에서 전이중(Full-Duplex) 통신을 가능하게 하는 프로토콜이에요. 기존의 HTTP와 달리, 연결이 맺어진 후에는 클라이언트와 서버 모두 언제든지 상대방에게 데이터를 전송할 수 있어요. ⭐ 전이중(Full-Duplex) / 반이중(Half-Duplex) 전이중 통신은 통화하는 전화처럼, 서로 동시에 말하고 들을 수 있는 방식이에요. WebSocket이 바로 이 전이중 통신을 사용해 클라이언트와 서버가 끊임없이 데이터를 주고받을 수 있도록 해요. 반이중 통신은 무전기처럼, 한 사람이 말하는 동안 다른 사람은 듣기만 해야 하는 방..

Backend/Java 2026.01.18

Spring - SSE

안녕하세요. 오늘은 Spring Boot SSE(Server-sent-Events) 채팅 시스템에 대해 알아볼게요. SSE(Server_Sent Events)란? SSE는 서버가 클라이언트에게 실시간으로 데이터를 푸쉬할 수 있는 HTML5 표준 기술이에요. 즉 SSE는 단방향식 통신으로 비유를 하자면 플러그와 콘센트로 콘센트를 꽂으면 계속 전기가 흐르는 느낌으로 생가해주시면 될 것 같아요. 폴링(Polling) VS SSE 폴링방식은 다음과 같아요. 클라이언트 ──[요청]──> 서버 클라이언트 서버 (반복) 클라이언트 이 방식의 ..

Backend/Java 2026.01.16

Spring - PersistRepository

안녕하세요. 오늘은 리포지토리(Repository)를 하나로 통합해서 사용하지 않고, PersistRepository를 따로 생성해서 사용하는 이유에 대해 알아볼까 해요. 리포지토리를 따로 만드는 이유? 우리가 흔히 보는 방식은 보통 이렇게 설정할 거예요.public interface BoardRepository extends JpaRepository {} 이건 CRUD를 전부 한 곳에 몰아넣는 방식이에요. PersistRepository는 역할을 분리하는 구조예요.BoardPersistRepository // 저장 전용BoardQueryRepository // 조회 전용 (보통 따로 만듦) 분리하는 이유? 분리하는 이유는 "저장하는 코드"와 "조회하는 코드"의 성격이 다르기 때문이에요.그..

Backend/Java 2026.01.06

결제 시스템 구축 - 핵심 개념 정리

안녕하세요. 오늘은 결제 시스템 구축을 위한 개념을 정리해 봤어요. 이 포스팅의 목표는 결제 시스템 구축에 대한 PG사와 결제 모듈(PortOne)의 개념을 이해하는 것이에요. PG (Payment Gateway) PG사는 온라인에서 상품이나 서비스를 구매할 때, 다양한 결제 수단(카드, 계좌이체, 간편 결제 등)을 통해 안전하게 결제할 수 있도록 지원하는 전자지급결제대행 서비스예요. 오프라인 식당의 신용카드 단말기와 같고, KG이니시스, 토스페이먼츠, NHN KCP, 카카오페이 등 사용해요. 포트원 (PortOne / 구 아임포트) 수많은 PG사의 복잡하고 서로 다른 결제 코드를 하나의 표준화된 API로 통합해 주는 결제 연동 설루션이에요. 개발자는 포트원 코드 하나만 작성하면, 관리자 ..

Backend/Java 2026.01.02

이메일 중복방지

안녕하세요. 오늘은 이메밀 중복방지를 어떻게 하는지 간단하게 알아볼게요. 이메일 중복방지는 보통 회원가입시 동일한 이메일 주소를 사용하지 않게 방지하는 방법이에요. 1. User 엔티티 유니크 설정 @Column(unique = true) private String email; 2. UserRepository 내 쿼리 메서드 생성 // 이메일 존재 여부 확인 쿼리 네임드 메서드 설계 Optional findByEmail(String email); 3. UserService 회원가입 로직 내 조건문 추가 // 1-1 이메일 중복 체크 if (userRepository.findByEmail(joinDTO.getEmail()).isPresent()) { throw ..

Backend/Java 2025.12.31

회원가입 이메일 인증 기능 (Google smtp 활용)

안녕하세요. 오늘은 회원가입 시 이메일 인증 기능에 대해 알아볼게요. SMTP SMTP는 Simple Mail Transfer Protocol의 약자입니다. 단어 그대로 해석하면 간이 우편 전송 규약 이에요.. 인터넷 세상에서 "이메일을 보낼 때 지켜야 하는 약속(규칙)"이라고 정의할 수 있어요. SMTP 핵심 특징 SMTP는 보내는 전용이에요. 즉 SMTP는 오로지 메일을 발송(PUSH)할 때만 사용하고, 반대로 메일을 확인(수신)할 때는 POP3나 IMAP이라는 다른 프로토콜을 사용해요. 현 포스팅 내용은 회원가입 인증번호를 보내기만 하기 때문에 SMTP만 있으면 돼요. 사전 준비 (Google 앱 비밀번호 발급) ❌ 일반 구글 비밀번호로는 접근이 불가능해요! 1. Google 계정 관리..

Backend/Java 2025.12.29

Spring - security crypto

안녕하세요. 오늘은 비밀번호 암호화 처리(security-crypto)에 대해 알아볼게요 security crypto security crypto는 비밀번호 같은 민감한 데이터를 안전하게 처리하기 위한 암호화 도구 모음이에요. 상세하게 설명한다면 Spring Security Crypto 모듈의 BCryptPasswordEncoder를 활용하여 비밀번호를 안전하게 암호화하여 저장하도록 구현했어요. 사용자가 입력한 평문 비밀번호는 BCrypt 알고리즘으로 해싱되어 데이터베이스에 저장되며, 로그인 시에는 암호화된 비밀번호와 평문 비밀번호를 안전하게 비교해요. ※ 주요 단어 해석하기 ※ 해시값, 해싱(Hash Value) : 원본 데이터를 알아볼 수 없게 으깨어 만든 문자열 (Ex. 믹서기) 평문:..

Backend/Java 2025.12.25

Spring - OSIV

안녕하세요. 오늘은 OSIV에 대해 알아볼게요. OSIV OSIV(Open Session(In JPA에선 EntityManager) In View)는 요청이 시작될 때부터 응답이 끝날 때까지 영속성 컨텍스트(Seeeion / EntityManager)를 열어두는 전략으로 컨트롤러(View)에서도 JPA 엔티티를 시용할 수 있게 해주는 기능이에요. OSIV가 왜 생겼을까? 문제의 상황은 예시로 보여드릴게요.@Controllerpublic class MemberController { @GetMapping("/members") public Member getMember() { return memberService.findMember(); }}// Service@Trans..

Backend/Java 2025.12.18