Spring 16

싱글톤(Singleton) 패턴이란?

1. 싱글톤이란?싱글톤(Singleton)은 특정 클래스의 인스턴스를 프로그램 전체에서 단 하나만 생성되도록 보장하는 디자인 패턴이다. 일반적으로 객체를 생성하면 new를 사용할 때마다 새로운 인스턴스가 만들어진다.MyClass a = new MyClass();MyClass b = new MyClass();이 경우 a와 b는 서로 다른 객체이다.하지만 싱글톤으로 설계된 클래스는 여러 곳에서 사용하더라도 하나의 인스턴스만 공유해서 사용한다. 2. 싱글톤은 어디에 사용할까?싱글톤은 애플리케이션 전체에서 하나만 존재해도 되는 객체에 사용할 수 있다.대표적인 예시는 다음과 같다. ① 설정(Configuration) 객체프로그램 전체에서 공통으로 사용하는 설정 정보를 관리하는 객체이다.애플리케이션 ├─ A 기..

TIL 2026.07.23

error: cannot find symbol @Value("${jwt.secret.key}") 해결

1. 문제 상황 JWT를 구현하면서 application.yml에 저장된 JWT Secret Key를 가져오기 위해 @Value 어노테이션을 사용했다.근데 심볼을 찾을 수 없다는 오류가 뜸. 2. 원인문제의 원인은 Lombok과 Spring 모두 @Value라는 이름의 어노테이션을 가지고 있는데나는 Lombok의 @Value 이노테이션을 import하고 있었음.3. 해결 방법Spring Framework에서 제공하는 @Value를 import하도록 수정했다. 4. Spring의 @Value란?Spring의 @Value는 application.properties 또는 application.yml 등에 설정된 값을 주입받을 때 사용하는 어노테이션이다.예를 들어 application.yml에 다음과 같이 ..

트러블슈팅 2026.07.22

JPA N+1 문제란? (왜 생기고 어떻게 해결할까?)

프로젝트를 진행하면서 코드 리뷰에서 "N+1 문제가 발생할 수 있다." 라는 피드백을 받았다.처음에는 이름만 들어서는 감이 오지 않았다. "도대체 왜 조회가 100번씩 일어난다는 거지?"그래서 이번 기회에 N+1 문제가 무엇인지, 왜 발생하는지, 어떻게 해결하는지 정리해보았다.N+1 문제란?N+1 문제는데이터를 조회할 때 처음 조회하는 쿼리(1번) 이후에 연관된 데이터를 가져오기 위해 N번의 추가 쿼리가 발생하는 현상이다.예를 들어 Customer와 Order가 있다고 생각해보자.Customer └── Order (1:N) 고객 목록을 조회하는 상황이다.List customers = customerRepository.findAll(); 여기까지는 SQL이 딱 한 번 실행된다.SELECT * FROM c..

TIL 2026.07.15

[Spring] 고객 조회 기능 구현하며 겪은 트러블슈팅 - Pageable과 JPQL 적용기

문제 상황고객 CRUD 기능을 구현하던 중 고객 전체 조회 API를 만들게 되었다.처음에는 단순하게 모든 고객을 조회하는 기능만 구현했다. List customers = customerRepository.findAll(); 이를 DTO로 변환하여 반환하는 구조였다. return customers.stream() .map(customer -> ...) .toList(); 하지만 단순 조회만 필요한게 아니라 고객 목록 조회 시페이지네이션상태(status) 검색이름 또는 이메일 검색기능까지 함께 지원해야 했다.처음 고민했던 방법처음에는 Repository 메서드를 각각 만들어 해결하려고 했다.findByStatus(...) findByNameContainingOrEmailContain..

트러블슈팅 2026.07.13

[Git] 팀 프로젝트에서 Git 협업 흐름 정리 (develop, feature, merge 이해하기)

Git 협업 흐름 정리왜 Git 협업 방식을 알아야 할까?개인 프로젝트에서는 main 브랜치 하나만 사용해도 크게 문제가 없었다.하지만 팀 프로젝트에서는 여러 명이 동시에 개발하기 때문에 각자의 작업을 안전하게 관리하고 합치는 과정이 필요하다.우리 팀은 다음과 같은 브랜치 전략을 사용했다.main │develop │feature/customerfeature/productfeature/order... main : 최종 배포 브랜치develop : 개발이 완료된 코드가 모이는 브랜치feature/ : 각자 기능을 개발하는 브랜치개발 시작하기프로젝트를 clone 받으면 처음에는 develop 브랜치에 있다.먼저 자신의 기능 브랜치를 만든다.git checkout -b feature/customer 브..

웹 개발 기초 2026.07.11

Session 로그인 적용하면서 API 구조 리팩토링하기

이번 일정관리 API를 만들면서 가장 큰 변화는 로그인(Session) 기능을 적용하면서 URL 구조가 바뀐 것이었다.처음에는 로그인 기능이 없었기 때문에 모든 요청은 URL에 userId를 포함해야 했다. 예를 들어,POST /users/1/schedulesGET /users/1/schedulesGET /users/1/schedules/3PUT /users/1/schedules/3DELETE /users/1/schedules/3 컨트롤러도 자연스럽게 이렇게 작성했다.@PostMappingpublic ResponseEntity createSchedule( @PathVariable Long userId, @RequestBody CreateScheduleRequest request)..

트러블슈팅 2026.07.09

[Spring] MVC에서 자주 사용하는 객체와 어노테이션 정리

로그인 기능을 구현하면서 HttpServletRequest, HttpSession, @RequestHeader, @SessionAttribute가 자주 등장한다. 이름도 비슷하고 역할도 헷갈리기 쉬워서 각각의 역할을 정리해보았다. 1. HttpServletRequest무엇인가?클라이언트(브라우저)가 서버로 보낸 HTTP 요청 전체를 담고 있는 객체이다.쉽게 말하면, "사용자가 서버에게 보낸 모든 정보가 들어있는 상자" 라고 생각하면 된다. 예를 들어 사용자가POST /login을 요청했다면,요청 URL요청 방식(GET, POST)요청 헤더쿠키세션Body(JSON)등 모든 정보를 HttpServletRequest가 가지고 있다.사용할 수 있는 예시request.getParameter(...)request...

TIL 2026.07.08

[Spring] JPA 연관관계 매핑 정리

연관관계 매핑이란?객체지향에서는 객체와 객체가 서로를 참조하지만, 데이터베이스에서는 객체가 아닌 외래키(Foreign Key) 로 관계를 표현한다.JPA 연관관계 매핑은 객체의 참조를 데이터베이스의 외래키와 연결해주는 기능이다. 예를 들어 회원과 주문이 있다고 가정하면,회원 1명은 여러 개의 주문을 할 수 있다.주문 1개는 회원 1명에게만 속한다.데이터베이스에서는 다음과 같이 표현된다.Member----------------idnameOrder----------------idpricemember_id (FK) 하지만 객체에서는 숫자(member_id)를 저장하지 않고 객체를 저장한다.@ManyToOne@JoinColumn(name = "member_id")private Member member; 즉, 객..

Spring 2026.07.06

[Spring] Session과 JWT란?

웹 서비스에서 로그인 기능을 구현할 때 가장 중요한 문제는 "로그인 상태를 어떻게 유지할 것인가?" 이다.HTTP는 Stateless(무상태) 프로토콜이기 때문에 요청이 끝나면 이전 요청을 기억하지 않는다. 즉, 로그인 요청이 끝난 후 다음 요청이 들어오면 서버는 사용자가 누구인지 알 수 없다.그래서 로그인 상태를 유지하기 위한 기술로 Session과 JWT를 사용한다. HTTP는 왜 로그인을 기억하지 못할까?예를 들어 인스타그램에 로그인했다고 가정해보자.로그인↓홈 화면↓좋아요↓댓글 작성 만약 로그인 정보를 저장하지 않는다면사용자는 매 요청마다 로그인해야 한다.홈 화면 → 아이디, 비밀번호 입력좋아요 → 아이디, 비밀번호 입력댓글 → 아이디, 비밀번호 입력 이 문제를 해결하기 위해 Session과 JW..

Spring 2026.07.03

[Spring] 핵심 개념 정리 (Bean, IoC, DI)

스프링을 처음 공부하면 가장 많이 듣는 단어가 있다.BeanIoCDI처음에는 어려워 보이지만 사실 이 세 가지는 하나의 흐름으로 연결되어 있다. Bean이란? Bean = 스프링이 직접 생성하고 관리하는 객체(Object) 예를 들어@Servicepublic class MovieService {} 프로그램이 실행되면스프링이 객체 생성을 대신 실행한다.new MovieService(); 그리고 이 객체를 보관한다.이렇게 스프링이 관리하는 객체를 Bean이라고 한다. Spring ┌─────────────────┐ │ │ │ MovieService │ ← Bean │ MovieRepository ..

Spring 2026.07.02