Spring 28

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

Spring ) Spring Security 에 @AuthenticationPrincipal 사용시 예제

1. 개요 @AuthenticationPrincipal 어노테이션은 Spring Security를 사용할 때 현재 인증된 사용자의 정보를 가져오는 데 사용된다. 이를 활용하여 Controller 및 ServiceImpl 클래스에서 현재 인증된 사용자의 정보를 가져오는 부분을 변경하고자 함. 먼저, Controller에 해당 어노테이션을 추가하여 UserDetails를 가져온 후, ServiceImpl에 필요한 사용자 정보를 파라미터로 전달한다. 2-1. RecordController 변경 전 // class,class 위 어노테이션 생략 private final RecordService recordService; @PostMapping public ResponseEntity recordTime(@Requ..

Spring 2023.09.05

Spring ) Blacklist

1.JwtUtil.java // 토큰 블랙리스트 : 사용된 토큰을 사용하지 못하게 저장하여 관리함 @Autowired private TokenBlacklistRepository tokenBlacklistRepository; // 블랙리스트에 토큰이 있는지 확인, 존재하면 != null 즉 true 반환 public boolean isTokenBlacklisted(String tokenValue) { TokenBlacklist tokenBlacklist = tokenBlacklistRepository.findByToken(tokenValue).orElse(null); return tokenBlacklist != null; } 2.JwtAuthorizationFilter @Override protected ..

Spring 2023.07.19