전체 글 106

[쇼핑몰 프로젝트] 서버 다중화 환경에서 세션 기반 인증 문제 해결 – JWT 적용

0. 개요쇼핑몰 프로젝트는 MSA 방식으로 설계했고, 클라이언트의 모든 요청은 먼저 Nginx로 받아서 이를 프론트 서버로 로드 밸런싱한다.이 프론트 서버에서 사용자 인증을 진행하는데, Spring Security를 사용했다. 그런데 간헐적으로 인증이 안되는 현상이 문제가 발생했다. 1. 문제 원인 분석문제는 Spring Security의 인증방식에서 비롯됐다. 로그인 시, Spring Security의 동작 과정을 보면 (1) 사용자의 인증 요청: 로그인 (아이디 - username, 패스워드 - password) (2) UsernamePasswordAuthenticationFilter요청에 세션ID(JSESSIONID)가 없으면, 사용자는 인증되지 않은 상태로 간주되고, 요청에서 username과 ..

[쇼핑몰 프로젝트] 외부에 노출되는 PK, 어떤 전략을 사용해야 할까?

0. 개요쇼핑몰 프로젝트를 진행하며 회원 테이블의 PK 생성 전략에 대해 고민했던 내용을 공유하려고 한다.DB는 MySQL을 사용했다.1. 문제프로젝트 요구사항에서 DB는 확장 가능하고, 인증을 위해 회원의 PK는 외부에 노출되어도 문제 없어야 했다.이를 위해 기본키 생성 전략으로 아래의 5가지 방법에 대해 고민했고, 결론부터 말하자면 TSID를 사용했다.Auto_IncrementUUIDULIDSnowflake IDTSID2. 생성 전략들1) Auto_Increment개요데이터베이스에서 자동 증가(시퀀스) 값을 사용하여 유일한 식별자(Primary Key) 를 생성하는 방식.보통 INTEGER 또는 BIGINT 타입의 값을 사용하며, 새로운 레코드가 추가될 때마다 1씩 증가함.특징간단한 구현: 데이터베이..

[쇼핑몰 프로젝트] 외래 키(FK), NULL이어도 괜찮을까?

1. 문제 ERD 설계 중 비회원도 장바구니를 이용할 수 있어야 한다고 생각했다.비회원의 장바구니도 DB에 저장할 것인가?비회원의 장바구니도 DB에 저장하기로 했다.-> 비회원도 잠재적인 고객이기 때문에, 장바구니를 DB로 저장하도록 결정했다.     (Redis에 저장 후 스케줄러와 배치로 DB에 백업하는 방식)DB에 저장한다면 비회원의 장바구니는 어떻게 식별할 것인가?UUID를 장바구니 PK로 사용하고, 고객(회원/비회원)에게 해당 UUID를 할당하는 방식으로 해결하고자 했다.-> 장바구니 테이블은 회원 테이블과 연결되어 있지만, 비회원의 경우 회원 FK를 어떻게 처리할 것인가? 2. 시행착오"고객 테이블을 만들고, 회원은 고객 테이블에 의존하는 관계로 설계하면 어떨까?" 그런데 이렇게 되면 비회원도..

[쇼핑몰 프로젝트] 프로젝트 후기

NHN Academy Java 백엔드 과정의 최종 팀 프로젝트를 무사히 마쳤다.2024.12.03 ~ 2025.01.24 동안 7명이 함께한 프로젝트를 통해 많은 것을 배웠고, 할 수 있다는 자신감과 함께 나의 부족함을 절실히 느꼈다. 프로젝트를 진행하면서 가장 많이 한 고민은 "이게 맞을까?" 였다. 우리 모두 처음 경험하는 것들이 많았기에, 누구도 확신을 가지고 말할 수 없었다. 그래서 각자 맡은 역할을 수행하면서도 함께 공부하고 논의하며 개발을 진행했다. 이 과정에서 공부한 내용, 직면했던 문제들, 우리가 고민했던 선택들과 그 근거들을 정리하여 공유할 예정이다. 깃 허브https://github.com/nhnacademy-be8-OneBook nhnacademy-be8-OneBooknhnacadem..

[Spring Boot] DB 연결하기 - MySQL, H2, Redis

1. MySQL(0) MySQL 로컬 서버 활성화/종료# 서버 활성화mysql.server start# 서버 종료mysql.server stop (1) 터미널로 연결하기로컬에 설치된 MySQL 서버에 root 사용자로 접속하는 명령어.mysql -u root -p MySQL 원격 접속을 위한 명령어.-h: 호스트. 111.111.111.111은 MySQL 서버의 IP 주소.-P: 포트 번호.-u: 사용자 이름.-p: 비밀번호 입력을 요청.mysql -h 111.111.111.111 -P 3306 -u nhn_exam_17 -p (2) Spring Boot 에서 properties 파일로 연결하기의존성 추가. com.mysql mysql-connector-j runtime 2. pr..

Spring 2024.11.30

[개발환경 설정] 인텔리제이 코드 자동완성/제안 기능 끄기

1. 코드 자동완성 기능 끄기Settings -> Editor -> General -> Code Completion -> Sort Completion suggestions based on machine learning 끄기. 2. 코드 제안 기능 끄기1의 코드 자동완성 기능을 해제해도 아래처럼 코드를 제안해서 보여준다. 그러나 이 제안의 정확도가 높지 않고, 매우 불편해서 해당 기능도 끄는 방법을 소개한다. Settings -> Editor -> General -> Inline Completion -> Enable local Full Line Completion Suggestions 끄기.

개발환경 설정 2024.11.28

[Spring Boot] 01. Spring Boot Core (4) - Test와 Logging

10. Spring Boot TestTesting 이란?테스팅의 종류Spring Boot Testing11. 로깅10. Spring Boot TestTesting 이란?Java로 작성된 SW의 각 부분이 제대로 동작하는지 확인하는 과정.일바적으로 SW가 동작하길 기대하는 방식을 Given/When/Then 패턴으로 작성.Given: 어떠한 데이터가 주어질때.When: 어떠한 기능을 실행하면.Then: 어떠한 결과를 기대한다. 테스팅의 종류단위 테스트 (Unit Testing)함수나 메소드의 기능을 검증하는 테스트이다.각 기능이 독립적으로 올바르게 동작하는지 확인하기 위해 사용.통합 테스트 (Integration Testing)단위 테스트를 통과한 개별 Component나 Class가 서로 올바르게 협력하..

Spring 2024.11.24

[Spring Boot] JDK Proxy vs CGLIB Proxy

JDK Proxy인터페이스 기반 프록시JDK Proxy는 자바 리플렉션과 인터페이스를 기반으로 프록시 객체를 생성한다. 따라서 대상 객체가 반드시 인터페이스를 구현해야 한다.리플렉션 사용.더보기Proxy.newProxyInstance를 보면 Reflection을 사용하고 있다.InvocationHandler를 구현해서 사용.public class JdkGreeting implements Greeting { Greeting proxy; public JdkGreeting(KoreanGreeting koreanGreeting) { proxy = (Greeting) Proxy.newProxyInstance(Greeting.class.getClassLoader(), ..

Spring 2024.11.24

[Spring Boot] 서비스 추상화 (Portable Service Abstraction)

1. 서비스 추상화 (PSA, Poratble Service Abstraction)개발자가 특정 환경이나 기술에 종속되지 않고, 일관된 방식으로 서비스를 사용할 수 있도록 추상화를 제공.Interface로 사용하고, Interface의 구현부(implements)만 수정해서 사용.2. Spring Boot Application의 내장 Web Server를 Tomat -> Jetty로 변경하기(1) spring-boot-starter 에서 tomcat 관련 라이브러리를 제거.(2) jetty 관련 라이브러리를 추가. pom.xml 4.0.0 org.springframework.boot spring-boot-starter-parent 3.2.5 ..

Spring 2024.11.09

[Spring Boot] 01. Spring Boot Core (3) - AOP(관점 지향 프로그래밍) *

8. 관점 지향 프로그래밍 (AOP)AOPSpring AOP 활성화AOP 주요 용어 정리Spring AOP 문법 - Point CutPointcut - Designator(지시자) 옵션Pointcut - 표현식 예제Spring AOP 문법 - AdviceAdvice - 사용Advice - JoinPoint 활용8. 관점 지향 프로그래밍 (AOP)AOP프로그램 구조를 다른 방식으로 생각하게 함으로써 OOP를 보완.OOP에서 모듈화의 핵심 단위는 Class 이지만, AOP에서 모듈화의 핵심 단위는 Aspect.관점(Aspect)는 다양한 타입과 객체에 걸친 관심(Concern)을 모듈화 할 수 있게 한다.관심사를 분리하여, 관점별로 각각의 기능을 모듈화.설정을 추가하여 Weaving함.(Weaving: Ad..

Spring 2024.11.08