Spring/Spring boot

Spring/Spring boot

Spring Boot에서 발생한 무한 참조 문제 및 Hibernate 프록시 직렬화 문제 해결하기

프로젝트를 진행하던 도중 Gemini API를 이용하여 상품 내용에 대한 도움을 주는 기능을 구현하고 자신이 추천 받은 내용을 조회할 수 있는 기능을 구현하던 도중 User와 AiDescription 엔티티가 양방향 연관관계를 가지고 있어 무한 루프 문제가 발생했다. 사실 연관관계를 생각 안하고 단순 조회만 생각하고 작성을 했기에 이런 문제가 발생한 거라 앞으론 생각을 하면서 작성을 하려고 기록해두려한다.... 1. 무한 참조 문제 발생- 문제 상황Spring Boot + JPA 환경에서 엔티티 간 양방향 연관관계를 설정할 때 JSON 직렬화 과정에서 무한 참조 문제가 발생- 무한 참조 문제 개념무한 참조는 엔티티 A가 엔티티 B를 참조하고, B가 다시 A를 참조하면서 JSON 직렬화 과정에서 끝없이 순..

Spring/Spring boot

[Spring Boot] 예외 처리

Sring Boot 예외 처리 1. Spring Boot에서 예외 처리가 중요한 이유애플리케이션에서 에러가 발생했으 경우 이를 잘 관리해서 사용자에게 친절한 응답을 제공하기 위함전역에서 처리를 하면 코드 중복을 줄이고 유지보수성이 향상됨흐름 : 사용자 요청 -> Controller -> Service -> Repository -> 예외 발생 -> GlobalExceptionHandler -> 클라이언트에게 JSON 응답 반환[ErrorCode]- 각종 예외 코드를 Enum으로 관리@Getter@RequiredArgsConstructorpublic enum ErrorCode { // 404: 리소스를 찾을 수 없음 USER_NOT_FOUND(HttpStatus.NOT_FOUND, "유저가 존재하..

Spring/Spring boot

@PathVariable name 생략시 에러

프로젝트 도중 jakarta.servlet.ServletException: Request processing failed: java.lang.IllegalArgumentException: Name for argument of type [java.lang.Long] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag. 에러가 발생했는데 주로 @PathVariable와 @RequestParam 두 에노테이션에서 발생한다고 한다. //작동 @GetMapping("/posts/{postId}") public PostRespons..

Spring/Spring boot

검증 2 (Bean Validation)

5. 검증 2 - Bean Validation1. Bean Validation검증 기능을 검증 1에서 처럼 매번 작성하는 것은 번거롭기 때문에 이런 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고 표준화한 것이 바로 Bean Validation이다. Bean Validation은 특정 구현체라기보단 기술 표준이다. 즉 검증 애노테이션과 여러 인터페이스의 모음이라고 할 수 있다. 먼저 순수한 Bean Validation 사용법 부터 알아보려하는데 사용하려면 의존 관계를 추가해야 한다. build.gradle에 implementation 'org.springframework.boot:spring-boot-starter-validation' 를 추가해준다.  [item.java]Bean Validati..

Spring/Spring boot

[JDBC] 데이터 접근 기술 - 테스트

1. 테스트 - 데이터베이스  분리실제 데이터베이스를 연동해서 테스트를 하면 데이터베이스에 이미 과거에 서버를 실행하며 저장했던 데이터가 보관 되어있어서 이 데이터가 현재 테스트에 영향을 끼치게 된다.이를 해결하기 위해서는 테스트를 다른 환경과 철저하게 분리해야하는데 가장 간단한 방법으로는 테스트 전용 데이터베이스를 별도로 운영하는 것이다. H2 데이터베이스를 용도에 따라서 2가지로 구분한다. jdbc:h2:tcp://localhost/~/test : local에서 접근하는 서버 전용 데이터베이스 jdbc:h2:tcp://localhost/~/testcase : test 케이스에서 사용하는 전용 데이터 베이스하지만 테스트를 2번 이상 실행하게 되면 이전 테스트에서 저장된 데이터가 계속 남아있을 수 있기 ..

Spring/Spring boot

[JDBC] JdbcTemplate

1. JdbcTemplate 설정sql을 직접 사용 하는 경우에는 스프링이 제공하는 jdbcTemplate를 사용하면 JDBC를 매우 편리하게 사용할 수 있다. 장점spring-jdbc 라이브러리에 포함되어 있어 별도의 복잡한 설정 없이 바로 사용 가능하다.콜백 패턴을 사용하기 때문에 JDBC를 직접 사용할 때 발생하는 대부분의 반복 작업을 대신 처리해준다.SQL작성하고, 전달 파라미터 정의하고, 응답 값 매핑만 하면 된다. 단점동적 SQL 해결하기가 어렵다.먼저 JdbcTemplate를 사용하려면 build.grdle에 추가를 해야하는데 H2 데이터베이스에 접속해야하기 때문에 H2 클라이언트 라이브러리도 추가해준다. 진행 전에 H2 데이터베이스에 item 테이블을 생성해야 한다.drop table if..

Spring/Spring boot

검증 1(validation)

4. 검증(1) - validation1. 검증 요구사항상품 관리 시스템에 새로운 요구사항을 추가해보자.요구사항 : 검증 로직 추가타입 검증 : 가격, 수량에 문자 들어가면 검증 오류 처리필드 검증 : 상품명 (필수, 공백X), 가격(1000원 이상, 1백만원 이하), 수량(최대 9999)특정 필드의 범위를 넘어서는 검증 (가격 * 수량 합 10,000원 이상)컨트롤러의 중요한 역할중 하나는 HTTP 요청이 정상인지 검증하는 것이다.  -클라이언트 검증, 서버 검증클라이언트 검증은 조작할 수 있으므로 보안에 취약하다.서버만으로 검증하면, 즉각적인 고객 사용성이 부족해진다.둘을 적절히 섞어서 사용하되, 최종적으로 서버 검증은 필수이다.API 방식을 사용하면 API 스펙을 잘 정의해서 검증 오류를 API 응..

Spring/Spring boot

[JDBC] 트랜잭션 2

4. 스프링과 문제 해결 - 트랜잭션1. 문제점들애플리케이션 구조 여러가지 애플리케이션 구조가 있지만 가장 많이 사용하는 방법은 역할에 따라서 3가지 계층으로 나누는 것이다. 프레젠테이션 계층에서는 UI 관련된 처리를 담당하며 웹 요청과 응답을 다루고 사용자의 요청을 검증하고 주로 서블릿과 HTTP 같은 웹 기술, 스프링 MVC를 사용한다. 서비스 계층에서는 비즈니스 로직을 담당하며 가급적 특정 기술에 의존하지 않고 순수 자바 코드로 작성을 한다. 데이터 접근 계층에서는 실제 DB에 접근하는 코드를 작성하며 JDBC, JPA, Redis 등 다양하다. 이 계층들 중에서 가장 중요한 계층은 핵심 비즈니스 로직이 들어가 있는 서비스 계층이다. 다른 계층 기술들이 변해도 비즈니스 로직은 최대한 변경 없이 유지..