티스토리 뷰

Hibernate: 
    select
        r1_0.user_id,
        r1_0.role 
    from
        user_role r1_0 
    where
        r1_0.user_id=?
2024-04-08T12:15:58.231+09:00  WARN 23656 --- [nio-8082-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1054, SQLState: 42S22
2024-04-08T12:15:58.231+09:00 ERROR 23656 --- [nio-8082-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : Unknown column 'r1_0.role' in 'field list'
org.springframework.security.authentication.InternalAuthenticationServiceException: JDBC exception executing SQL [select r1_0.user_id,r1_0.role from user_role r1_0 where r1_0.user_id=?] [Unknown column 'r1_0.role' in 'field list'] [n/a]; SQL [n/a]

 

계속해서 user_role 테이블에 role 컬럼이 없다는 오류가 났습니다.

쿼리를 살펴보니 user_role 테이블에서 user_id와 role_id를 찾아야 하는데 role_id가 아닌 role을 찾고 있는 것을 발견했고, 매핑과 관련된 이슈이지 않을까 생각했습니다.

 


 

 

1️⃣ @OneToMany에서는 name이 아닌 mappedBy

모든 관계에서 다 옵션을 name으로 표현했는데 양방향 관계의 매핑에서는 mappedBy를 사용해야한다는 사실을 알게되었습니다.

@JoinColumn: 이 어노테이션은 관계를 맺는 테이블에서 외래 키를 관리할 때 사용됩니다. @JoinColumn 어노테이션을 사용하면 해당 엔티티가 속한 테이블에 외래 키가 생성됩니다. 위의 코드에서 @JoinColumn(name = "user_id")은 roleListUserRole 엔티티와의 관계를 맺을 때 user_id 컬럼을 외래 키로 사용한다는 것을 나타냅니다.

mappedBy: 이 어노테이션은 양방향 관계를 매핑할 때 사용됩니다. 양방향 관계에서는 연관된 엔티티들이 서로를 참조할 수 있어야 합니다. 이때 mappedBy 속성을 사용하여 관계의 주인을 명시합니다. 관계의 주인은 외래 키를 관리하는 엔티티입니다. 위의 코드에서는 @OneToMany(mappedBy = "user")와 같은 형태로 사용될 수 있습니다. 여기서 "user"는 UserRole 엔티티에 있는 User 타입의 필드를 나타냅니다.

 

결과적으로

일대다 관계에서는 @OneToMany 어노테이션을 사용하며, mappedBy 속성을 통해 연관된 엔티티의 필드를 지정합니다. name 속성은 사용되지 않습니다.

 


 

UserEntity

@OneToMany 어노테이션에서 mappedBy 속성은 관계가 반대쪽 엔티티의 어떤 필드에 매핑되는지를 지정합니다.

따라서 mappedBy 속성은 UserRole 엔티티 클래스에서 User 엔티티의 어떤 필드에 매핑되는지를 가리켜야 합니다.

mappedBy 속성에 userId가 사용된 것은 부모 엔티티인 User 클래스의 userId 필드에 대한 매핑을 지정하는 것입니다. 

	@OneToMany(mappedBy = "userId", cascade = CascadeType.ALL)
	private List<UserRole> roleList;

 

 

UserRole

@Table(name = "user_role")

 

Role

@Table(name = "role")

    @OneToMany(mappedBy = "role", cascade = CascadeType.ALL)
    private List<UserRole> userRoleList;

 


2️⃣ UserRole.java 에서 UserEntity와의 다대일 부분 삭제


3️⃣ UserEntity에서 mappedBy = “userId”

 

roleList


4️⃣ Role.java 에서 userRole과의 일대다관계 부분 삭제


5️⃣UserRepository


6️⃣ UserDetailService

 

 


 

 

 💻결과

 

위와 같이 쿼리가 정상적으로 실행이 됐고

 

 

포스트맨에서 이렇게 토큰을 확인할 수 있습니다.

 

jwt.io

 

jwt.io에서 해당 토큰을 Encoded란에 넣으면

오른쪽 Decoded에서 내용을 확인할 수 있습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함