| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- Array
- ArrayList
- CSS
- 자바
- javascript
- 자바스크립트
- list
- 문자열
- input
- HashMap
- IntelliJ
- Eclipse
- js
- html
- vscode
- math
- 스프링부트
- 인텔리제이
- java테스트
- Java
- 정규식
- 단위테스트
- string
- Visual Studio Code
- 배열
- 자바문법
- 테스트자동화
- junit
- junit5
- SpringBoot
- Today
- Total
목록2026/02 (55)
어제 오늘 내일
이번에는 비즈니스 로직 수행 중 발생하는 모든 예외를 한곳에서 관리하는 [전역 예외 처리] 방법을 정리해 드리겠습니다. 1. 왜 필요한가요?개발을 하다 보면 "존재하지 않는 회원입니다", "비밀번호가 틀렸습니다"와 같이 다양한 예외 상황이 발생합니다.이때마다 각 컨트롤러에서 try-catch를 사용하여 예외를 처리하면 코드가 중복되고 관리가 어려워집니다.또한, 예외 처리를 하지 않아 500 Internal Server Error가 그대로 클라이언트에게 전달되면, 보안상 좋지 않을뿐더러 프론트엔드 입장에서도 원인을 파악하기 어렵습니다.우리는 @RestControllerAdvice를 사용하여 시스템 전반에서 발생하는 모든 예외를 깔끔한 JSON 포맷으로 통일하여 응답하도록 만들 것입니다.Step 1. 에러 ..
스프링 부트를 공부하다 보면 가장 힘든 점 중 하나가 "무슨 어노테이션이 이렇게 많아?" 라는 것입니다.@Controller, @Service, @Repository... 비슷비슷해 보이는데 무슨 차이가 있는지, 언제 뭘 써야 하는지 헷갈리시죠?오늘은 스프링 부트 개발 시 "이것만 알면 90%는 해결되는" 필수 어노테이션들을 용도별로 정리해 드립니다. '이 포스팅을 즐겨찾기 해두고 사전처럼 꺼내 보세요! 📚1. 객체 등록 (Bean 등록)스프링 컨테이너에게 "이 클래스는 내가 관리할 테니까, 메모리에 올려줘"라고 말하는 어노테이션들입니다. 어노테이션 설명 용도 @Component 가장 기본적인 Bean 등록 어노테이션 어디에 속하는지 애매한 일반 클래..
지난 포스팅에서 우리는 LogAspect 클래스를 이용해 로그를 자동화했습니다.하지만 코드가 어떻게 동작하는지 정확히 모르고 쓴다면, 나중에 "Service 계층에도 로그를 찍고 싶은데?" 라거나 "리턴 값을 바꾸고 싶은데?" 같은 상황이 왔을 때 응용하기 어렵습니다.오늘은 LogAspect 코드를 한 줄씩 해부하고, Pointcut 작성법부터 다양한 어노테이션까지 AOP의 핵심 문법을 마스터해 보겠습니다.1. 전체 코드 다시 보기먼저 분석할 대상인 LogAspect.java의 전체 코드입니다.@Slf4j@Aspect // (1) AOP 클래스 명시@Component // (2) Bean 등록public class LogAspect { // (3) Pointcut: 적용 범위 설정 (서..
log.info를 일일이 찍는 기초 단계를 넘어서, "숨만 쉬어도(API 호출만 해도) 로그가 자동으로 남는" AOP(Aspect Oriented Programming, 관점 지향 프로그래밍) 시스템을 구축해 보겠습니다.특히 우리가 만든 JWT 인증 시스템과 연동하여, "누가(User ID) 요청했는지"까지 자동으로 남기는 코드로 작성해 드립니다.1. 왜 AOP 인가요?컨트롤러가 100개라고 가정해 봅시다. 모든 메소드에 아래 코드를 넣으실 건가요?// 😱 끔찍한 노가다의 현장public String hello() { log.info("hello 메소드 시작"); // 반복 long start = System.currentTimeMillis(); // 반복 // ... 비즈니스 로직 ...
스프링 부트에서는 System.out.println() 대신 SLF4J라는 인터페이스와 Logback이라는 구현체를 기본으로 사용합니다. 이를 가장 쉽게 쓰는 방법은 롬복(Lombok)의 @Slf4j 어노테이션을 사용하는 것입니다.기초부터 차근차근 알려드릴게요. 1. 의존성 설정dependencies { // 1. Spring Boot Web (여기에 로깅 라이브러리(Logback)가 이미 들어있습니다!) implementation 'org.springframework.boot:spring-boot-starter-web' // 2. Lombok (편하게 로그를 찍기 위해 필수) compileOnly 'org.projectlombok:lombok' annotationProcess..
Java 개발을 하다 보면 로직은 한 줄인데, 그 데이터를 담기 위한 클래스(DTO) 코드가 수십 줄이 되는 경험, 다들 있으시죠? 롬복은 이 "지루한 반복 작업(Boilerplate Code)"을 어노테이션 하나로 해결해 줍니다.Java 개발자라면 피해 갈 수 없는 고통이 있습니다.바로 Getter, Setter, 생성자, toString... 같은 '보일러플레이트(Boilerplate)' 코드들입니다.의미 없이 반복되는 이 코드들은 클래스 파일을 길게 만들고 가독성을 떨어뜨립니다.오늘은 이 고통에서 해방시켜 줄 Lombok(롬복)에 대해 알아봅니다.1. 롬복(Lombok)이란?Lombok은 Java 라이브러리로, 반복되는 메서드를 컴파일(Compile) 시점에 자동으로 생성해 주는 도구입니다.우리가 ..
요즘 서비스에서 "회원가입" 버튼을 눌러서 ID, 비밀번호, 이메일, 이름을 일일이 입력하는 유저는 거의 없습니다. "구글로 시작하기", "카카오로 시작하기" 버튼 하나면 끝이죠.기존의 JWT 구조를 유지하면서 소셜 로그인을 붙이는 핵심 전략은 다음과 같습니다.사용자가 소셜 로그인(구글/카카오) 인증을 마침.스프링 시큐리티가 소셜 정보를 받아옴 (이메일, 이름 등).SuccessHandler에서 이 정보를 이용해 강제로 우리 서버의 JWT(Access + Refresh)를 발급.프론트엔드로 리다이렉트시키며 토큰을 전달.Step 1. 사전 준비 (Google Cloud Console)코드를 짜기 전에 구글에서 "내 앱이 로그인 좀 쓸게"라고 허락을 받아야 합니다. Google Cloud Console 접..
Swagger를 연동하면 현재 작성한 API들이 자동으로 예쁜 문서 사이트로 만들어지고, 심지어 그 사이트에서 버튼 클릭만으로 API 테스트까지 할 수 있습니다.Spring Boot 3.x 버전에서는 SpringDoc 라이브러리를 사용하는 것이 표준입니다. 빠르게 적용해 봅시다!Step 1. 의존성 추가 (build.gradle)Spring Boot 3용 springdoc-openapi 라이브러리를 추가합니다. 파일: build.gradle dependencies { // ... 기존 의존성 ... // Swagger (SpringDoc) - Spring Boot 3.x용 implementation 'org.springdoc:springdoc-openapi-starter-webmvc-u..
사실 실무에서는 "토큰이 만료되었는지", "서명이 위조되었는지", "형식이 잘못되었는지"를 구분해서 프론트엔드에게 알려줘야 할 때가 많습니다. (예: 만료면 재발급 요청, 위조면 강제 로그아웃 등)하지만 기존 코드처럼 JwtTokenProvider에서 예외를 try-catch에서 false만 반환하면, 구체적인 이유를 알 수 없게 되죠.이를 해결하기 위해 1. Provider가 예외를 던지게 수정하고, 2. 앞단 필터(ExceptionHandlerFilter)가 이를 잡아서 처리하는 완벽한 구조를 만들어 봅시다.스프링 시큐리티를 쓰다 보면 당황스러운 점이 하나 있습니다."왜 @ControllerAdvice가 JWT 예외를 못 잡지?"이유는 간단합니다. 필터(Filter)는 컨트롤러보다 먼저 실행되기 때문..
Spring Security를 사용할 때 가장 많이 겪는 혼란 중 하나가 "왜 @ControllerAdvice나 @ExceptionHandler가 작동하지 않지?" 입니다.이유는 간단합니다.필터(Filter)는 컨트롤러(Controller)보다 앞단에서 실행되기 때문입니다.토큰 검증 단계에서 에러가 나면 컨트롤러까지 가지도 못하고 필터에서 튕겨 나가기 때문에, 우리가 평소에 쓰던 예외 처리 방식이 통하지 않습니다.Spring Security에서는 이 문제를 해결하기 위해 AuthenticationEntryPoint (인증 실패)와 AccessDeniedHandler (권한 실패)라는 두 가지 인터페이스를 제공합니다. 1. 문제 상황현재 상태에서:로그인 안 하고(토큰 없이) /members/test 접근 ..
