java 42

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

이메일 중복방지

안녕하세요. 오늘은 이메밀 중복방지를 어떻게 하는지 간단하게 알아볼게요. 이메일 중복방지는 보통 회원가입시 동일한 이메일 주소를 사용하지 않게 방지하는 방법이에요. 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 - interceptor

안녕하세요. 오늘은 인터셉터(interceptor)에 대해 알아볼게요. interceptor 인터셉터(interceptor)는 Spring MVC의 핵심 기능 중 하나로, 웹 애플리케이션에서 공통적인 처리를 재사용할 수 있게 해주는 강력한 도구예요. 인터셉터는 들어오는 요청과 나가는 응답을 가로채어 특정 로직을 수행할 수 있게 해주는 메커니즘을 제공해요. 이는 AOP(Aspect-Oriented Programming)의 일종으로 볼 수 있고, 컨트롤러(Controller)로 요청이 도달하기 전, 후 또는 완료된 후에 추가적인 처리를 하기 위해 사용돼요. 즉 인터셉터는 “요청이 컨트롤러에 도착하기 전·후에 공통 작업을 대신 처리해 주는 문지기” 에요. 인터셉터 활용 사례 1. 인증(Authent..

Backend/Java 2025.12.16

영속성 컨텍스트 (Persistence Context)

안녕하세요. 오늘은 영속성 컨텍스트에 대해 알아볼게요. 영속성 컨텍스트(Persistence Context) 영속성 컨텍스트는 JPA(Java Persistence API)를 공부할 때 가장 핵심이 되는 개념으로 “엔티티를 1차 캐시에 저장해 두고, 동일 트랜잭션 안에서 엔티티를 관리하는 JPA의 내부 저장소” 라고 생각하시면 되요. 영속성 컨텍스트는 엔티티를 저장하는 1차 캐시 에요. EntityManager는 엔티티를 DB에 바로 저장하지 않고, 먼저 영속성 컨텍스트라는 메모리 공간(1차 캐시)에 저장해요.Member member = new Member(1L, "userA");em.persist(member); // DB에 INSERT X -> 1차 캐시에 저장됨 ※ 영속성 컨텍스트는..

Backend/Java 2025.12.14

RESTful API

안녕하세요. 오늘은 코딩 공부하면서 "좋은 설계를 하는 기준이 뭘까?" 라는 생각을 하다가 작성해요. 좋은 설계를 통해 코드의 일관성과 유지보수가 쉬워지는 효과 RESTful API에 대해 알아볼까 해요. RESTful API REST의 제약 조건을 준수하는 API로 URI에 명사를 사용하고 (행위 HTTP 메서드로 표현) 계층 구조를 URI로 표현하면서 대소문자, 언더바(_) 사용 규칙을 준수해요. 그리고 HTTP 상태코드로 결과를 명확하게 전달해요. ※ REST 란? ※ REpresentaion Status TransFer의 약자로 자원(Resource)을 URI로 식별하고, HTTP 메서드를 이용해 해당 자원에 대한 정의하는 아키텍처 스타일이에요. 자원의 표현은 JSON, XML 등이 있고..

Backend/Java 2025.09.07

@Transactional

안녕하세요. 오늘은 제가 코딩 연습하다가 하나의 어노테이션 때문에 고생을 했는데요. 이 친구를 소개해볼까 해요. @ Transactional Transactional은 트랜잭션 제어용 어노테이션으로 DB 작업을 하나의 단위로 묶어 처리하는데요. 중간에 오류 나면 롤백(rollback), 문제없으면 커핏(commit)을 해줘요. 그런데 왜 고생을 했으냐고 한다면 이 어노테이션 뒤에 (readOnly = true) 적용 시 읽기 전용 트랜잭션 생성으로 읽기만 가능하고 수정이 불가능하게 돼요. 만약 어노테이션이 적용 후 수정하게 될 경우에 오류가 발생하게 됩니다. // 예제 코드@Transactional(readOnly = true)public void someMethod() { stockRep..

Backend/Java 2025.09.04