Spring 30

2025년 2월 21일 기준 Cannot resolve method 'parseClaimsJws' in 'JwtParserBuilder' 해결방법 Jwts.parserBuilder()

JJWT 0.12.0부터는 Jwts.parserBuilder() 대신 Jwts.parser().build()를 사용해야 한다. 이전 버전(0.11.x)까지는 Jwts.parserBuilder()가 정상적으로 동작했지만, 0.12.x부터는 해당 메서드가 사라지면서 NoSuchMethodError 또는 Method not found 같은 오류가 발생한다.   최신 버전 기준 사용하는 코드 Claims claims = Jwts.parser() .verifyWith(secretKey) .build() .parseClaimsJws(token) .getBody();    잘못된 옛날 코드의 예시Jwts.parser().setSigningKey(secretKey) .p..

Spring 2025.02.21

Could not autowire. No beans of 'PasswordEncoder' type found. BCryptPasswordEncoder 빈 주입 오류 간단하게 해결하기

@Service@RequiredArgsConstructor@Transactionalpublic class UserService { private final UserRepository userRepository; private final BCryptPasswordEncoder passwordEncoder; public UserResponse registerUser(UserRequest userRequest) { if (userRepository.findByUsername(userRequest.getUsername()).isPresent()) { throw new IllegalArgumentException("이미 사용 중인 아이디입니다."); }..

Spring 2025.02.19

로깅설정 DEBUG -> INFO 가 필요한 이유

로깅 설정을 DEBUG → INFO로 변경해야 하는 이유는 다음과 같음.1. 운영 환경에서 과도한 로그 방지DEBUG 레벨은 개발 및 디버깅을 위한 상세 로그를 남김.운영 환경에서 너무 많은 로그가 쌓이면 성능 저하 및 디스크 사용량 증가 문제가 발생할 수 있음.INFO 레벨로 설정하면 필요한 정보만 로깅하여 불필요한 성능 부담을 줄일 수 있음.2. 로그 가독성 향상DEBUG 로그는 너무 많은 세부 정보를 포함하여 중요한 로그가 묻힐 가능성이 있음.INFO 수준으로 설정하면 **중요한 애플리케이션 흐름(예: 서비스 시작, 주요 작업 완료 등)**만 기록되므로 가독성이 향상됨.3. 보안 및 개인정보 보호DEBUG 로그에는 내부 시스템 동작, SQL 쿼리, API 요청 데이터 등이 포함될 수 있음.운영 환경..

Spring 2025.02.12

NullPointerException이란 무엇이며, 어떻게 해결할 수 있나?

NullPointerException(NPE)란?NullPointerException(NPE)은 Java에서 null인 객체를 사용하려 할 때 발생하는 런타임 예외임.NPE가 발생하는 경우null 객체의 메서드를 호출할 때 String str = null; int length = str.length(); // NPE 발생null 객체의 필드에 접근할 때 class Example { String text; } Example ex = null; System.out.println(ex.text); // NPE 발생null인 배열 요소를 사용할 때 String[] array = new String[5]; array[0].length(); // NPE 발생null이 포함된 리스트나 맵을 사용할 때 List lis..

Spring 2025.02.12

@EqualsAndHashCode 사용 시 엔티티 간 무한 루프 발생 가능성에 대한 원인과 해결

무한 루프 발생 원인JPA 엔티티에서 연관 관계가 있을 때 @EqualsAndHashCode는 모든 필드를 비교하려고 한다.이때 서로를 참조하고 있는 경우 무한 루프가 발생할 수 있다. @Entity@Getter@EqualsAndHashCodepublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "user") private List orders;}@Entity@Getter@EqualsAndHashCodepublic class Order { @Id @GeneratedValue(strategy = GenerationTyp..

Spring 2025.02.06

JPA 엔티티에서 Lombok 사용 시 프록시 초기화 문제

JPA는 Lazy Loading을 사용할 경우 엔티티를 프록시 객체로 감싼다.Lombok의 @ToString, @EqualsAndHashCode는 모든 필드를 참조하는데, 이때 프록시 필드를 접근하려 하면 예외가 발생하게 된다. 예시@Entity@Getter@ToStringpublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) private List orders;} 문제 발생User user = userRepository.findById(1L).get();System.out..

Spring 2025.02.06

Lombok과 JPA 충돌 가능성 & 해결 방법

JPA 엔티티에서 Lombok을 사용할 때 충돌이 발생할 수 있는 대표적인 원인은:프록시 초기화 문제Setter 자동 생성으로 인한 객체 일관성 문제@EqualsAndHashCode로 인한 무한 루프Lombok을 안전하게 사용하는 방법✅ 필수적으로 사용하면 안 되는 어노테이션@Builder → 대신 @AllArgsConstructor + 정적 메서드 사용@EqualsAndHashCode → 대신 @Id 기반의 equals() 직접 구현@Setter → 대신 명시적인 변경 메서드 작성✅ 안전한 대체 방법@Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)public class User { @Id @GeneratedValue(strat..

Spring 2025.02.06

Spring ) SpringBoot로 SpringSecurity 기반의 JWT 토큰 구현하기

현대 웹서비스에서는 토큰을 사용하여 사용자들의 인증 작업을 처리하는 것이 가장 좋은 방법이다. 이번에는 토큰 기반의 인증 시스템에서 주로 사용하는 JWT(Json Web Token)에 대해 SpringBoot와 Spring Security 기반으로 직접 제작해보도록 하겠다. 1. Spring Security 처리 과정 Spring Security 아키텍쳐는 위와 같으며 각각의 처리 과정에 대해서 자세히 알아보도록 하자.(아래에서 설명하는 내용은 Json Web Token을 활용한 Spring Security의 구현 방식으로, Session과 Token 기반의 차이점에 대해서는 여기를 참고하시고, Form을 활용한 Session기반의 구현 방식이 궁금하시다면 여기를 참고해주세요!) [ 0. 사전 세팅 ] ..

Spring 2023.09.05