Spring 65

요청시 빈객체를 반환하는 경우

detailImages가 자꾸 {}, {} 이렇게 갯수는 맞는데 빈객체를 반환하였다. Fetch.EAGER로 해도 해결이안된다. 순환 참조는 주로 양방향 관계에서 발생하는 문제입니다. 예를 들어, Product가 ProductDetailImage 리스트를 참조하고, 반대로 ProductDetailImage가 Product를 다시 참조할 때 이러한 순환 참조가 발생할 수 있습니다. Jackson은 이러한 순환 참조를 처리하지 못하며, JSON 직렬화 과정에서 문제가 발생합니다. 다음 방법 중 하나를 사용하여 순환 참조 문제를 해결할 수 있습니다: @JsonIgnore: 이 어노테이션은 특정 필드의 직렬화를 방지합니다. 이를 사용하면 JSON 출력에 해당 필드가 포함되지 않습니다. 예를 들어, Product..

Spring 2023.09.15

google oauth

승인된 redirection URL : 구글로그인이 완료가되면 구글서버에서 우리한테 인증이 되었다는 코드를 돌려준다. 우리는 코드를 받아서 다시 acess토큰을 요청하고 acess토큰을 받아서 개인정보에 접근할수있는 권한이 생김 acess토큰을 얻기위해서 필요한게 코드인데 그 코드를 받을 수 있는 주소를 적는것. login/oauth2/code/google은 고정되어있다. 여기에대한 컨트롤러를 만들 필요가 없다. 라이브러리가 알아서 다 처리해주기 때문 - 구글 OAuth 인증에 대한 설명입니다. 구글 OAuth는 구글 계정의 정보를 사용하여 다른 웹 앱이나 서비스에서 로그인을 할 수 있게 하는 기능입니다. 이를 위해선 아래와 같은 과정을 거치게 됩니다. 로그인 버튼 클릭: 사용자가 "구글 계정으로 로그인..

Spring 2023.06.14

<T extends Number> 랑 <? extends Number> 랑 차이

와 이므로 ?에 해당하는 실제 타입을 알 수 없습니다. 따라서 와일드카드를 사용하는 경우에는 데이터를 읽는 것은 가능하지만, 원래의 타입에 대한 데이터를 추가하는 것은 안전하지 않습니다. 하지만, 메소드가 호출되는 시점에서의 입력 인자의 타입에 따라 와일드카드의 타입은 결정됩니다. 즉, 메소드가 실행되는 동안에만 그 타입이 결정되고, 메소드 실행이 종료되면 그 타입 정보는 사라집니다. 이렇게 동작하는 이유는 Java가 타입 안전성을 보장하기 위한 것입니다. 그래서 와일드카드를 사용할 때는, 주로 "타입에 상관없이 작동하는 코드"를 작성할 때 사용됩니다. 예를 들어, 리스트의 모든 요소를 출력하는 메소드를 작성할 때와 같은 경우입니다. 이런 경우에는 리스트의 타입이 무엇인지 알 필요가 없으므로 와일드카드를..

Spring 2023.06.14

@Valid

@Valid 어노테이션은 Java에서 사용하는 Bean Validation API의 일부로, 그 목적은 Bean(Java 클래스 인스턴스)에 설정된 검증 조건을 적용하기 위함입니다. 예를 들어, LoginDto 클래스에서 필드에 검증 어노테이션(@NotNull, @Size, @Email 등)을 설정했다면, @Valid 어노테이션을 사용함으로써 이러한 검증 조건을 활성화할 수 있습니다. 그렇게 해서 요청 본문으로 넘어온 데이터가 LoginDto의 검증 조건을 만족하는지 확인할 수 있습니다. @Valid가 없다면, 해당 검증이 수행되지 않고, 잘못된 데이터가 애플리케이션에 통과될 가능성이 있습니다. 이는 데이터 무결성 문제를 일으킬 수 있습니다. 따라서, 사용자로부터 입력을 받는 곳에서는 @Valid를 사용..

Spring 2023.06.13

@ManyToMany

@ManyToMany @JoinTable( name = "user_authority",//연결테이블의 이름 joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "authority_name")}) /* joinColumns: 현재 클래스(User)와 연결 테이블 사이의 연결을 정의하는 열입니다. 여기서는 "user_id"라는 이름의 컬럼이며, User 클래스의 "user_id"라는 필드를 참조합니다. inverseJoinColumns: 다른 클래스(Authority)와 ..

Spring 2023.06.13

@Builder

@Builder는 Lombok 라이브러리의 어노테이션입니다. 이 어노테이션은 패턴 중 하나인 '빌더 패턴'을 쉽게 구현할 수 있게 도와줍니다. 빌더 패턴은 객체를 생성하는 방법을 객체 자신이 아닌 외부의 별도 객체에 위임하여, 생성 코드와 비즈니스 로직을 분리합니다. 이렇게 하면 객체 생성 코드가 비즈니스 로직에 묻혀 있지 않아 코드의 가독성을 향상시키고, 객체 생성 과정에서 발생할 수 있는 오류를 줄이는 데 도움이 됩니다. Lombok의 @Builder 어노테이션을 사용하면, 객체를 생성할 때 setter를 사용하지 않고도, 원하는 필드만 선택하여 객체를 생성할 수 있습니다. 이는 많은 양의 생성자를 작성하지 않아도 되며, 각 필드에 어떤 값이 설정되는지 명확히 알 수 있기 때문에 코드를 이해하기 쉽게..

Spring 2023.06.13

애플리케이션 시작 시 데이터를 데이터베이스에 삽입방법 3가지

1. SQL 파일 사용: Spring Boot는 schema.sql 파일과 data.sql 파일을 자동으로 실행합니다. 각각 스키마 생성과 데이터 삽입을 위한 SQL 명령어들을 포함할 수 있습니다. 이 파일들은 src/main/resources 디렉터리에 위치해야합니다. data.sql 파일에 INSERT INTO 구문을 작성하여 애플리케이션 시작 시 데이터를 삽입할 수 있습니다. 예를 들어, data.sql 파일에서 INSERT INTO 명령을 사용할 때, 중복되는 데이터가 이미 데이터베이스에 있는 경우 SQL 오류가 발생합니다. 이는 대부분의 데이터베이스에서 기본적인 동작 방식입니다. 하지만, 중복된 데이터를 처리하는 방법은 데이터베이스와 SQL 스크립트 작성에 따라 다릅니다. INSERT IGNOR..

Spring 2023.06.13

JPQL vs Native SQL

JPQL (Java Persistence Query Language)과 Native SQL 둘 다 데이터베이스에 쿼리를 실행하는 데 사용되지만, 그들 사이에는 몇 가지 주요한 차이점이 있습니다. 이 차이점들은 다음과 같은 장단점으로 이어집니다. JPQL의 장점: 데이터베이스 독립성: JPQL은 데이터베이스 플랫폼에 독립적입니다. 즉, JPQL 쿼리는 여러 데이터베이스 시스템에서 작동합니다. 따라서 애플리케이션을 다른 데이터베이스로 마이그레이션해야 하는 상황에서 유용합니다. 객체 지향적: JPQL은 객체 지향 쿼리 언어입니다. 즉, SQL과 달리 JPQL 쿼리는 Java 객체 모델에 직접 매핑됩니다. 이를 통해 객체와 관련된 복잡한 쿼리를 더 쉽게 작성할 수 있습니다. JPQL의 단점: 제한된 기능: JP..

Spring 2023.06.13

JPA @EntityGraph(attributePaths = "authorities")

Spring Data JPA의 @EntityGraph 어노테이션은 엔티티 조회 시 해당 엔티티의 특정 관계를 함께 조회할 수 있도록 하는 기능입니다. 이를 Eager Fetching이라고도 합니다. 이 어노테이션을 사용하면, 한 엔티티를 조회하는 동안 다른 관련된 엔티티도 함께 조회하여 효율적으로 데이터를 로딩할 수 있습니다. 이는 N+1 문제를 해결하는 데 도움이 됩니다. 위에서 @EntityGraph(attributePaths = "authorities")를 사용하여 User 엔티티를 조회할 때 authorities와 연관된 엔티티도 함께 조회하도록 설정하였습니다. 즉, findOneWithAuthoritiesByUsername(String username) 메서드를 호출하면, 해당 사용자와 해당 사..

Spring 2023.06.13