Spring 31

Java Garbage Collection(GC)란 무엇이고 동작방식과 G1GC에 대해

C와 같은 프로그래밍 언어에서 메모리 할당 및 할당 해제는 수동 프로세스입니다.반면에, Java에서 메모리 할당 해제 프로세스는 Garbage Collection에 의해 자동으로 처리가 됩니다.[기본 프로세스]Step1 : MarkingGarbage Collector가 사용중인 메모리 조각과 사용하지 않는 메모리 조각을 식별합니다.마킹 단계에서 모든 개체들을 스캔하다보니 많은 시간이 소요될 수 있습니다. Step2 : Normal Deletion 참조되지 않은 개체를 제거하여 참조된 개체와 포인터를 여유 공간으로 남깁니다.메모리 할당자는 새 개체를 할당할 수 있는 여유 공간 블록에 대한 참조를 보유합니다. Step2a : Deletion with Compacting성능 향상을 위해 참조된 나머지 개체들을..

Spring 2025.07.22

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