TIL - Spring Security | Table 오류

su·2023년 6월 22일
0

TIL

목록 보기
27/93
post-thumbnail

문제1 - Spring Security

1) 문제


코드를 다 작성하고 실행하니까.. 선생님 화면과 다른 부분이 Console 창에 나타났다.
저 password가 나오면 안된다고 하시는데,, 왜그러지 ..?


참으로 어처구니가 없는 실수를 했다. 해당 클래스 뒤에 implements를 깜빡했다 ..
UserDetailsService를 implements 해주어야 하는데,

2) 시도

그런데 .. 이번에는 또 status: 999 오류가 발생했다.

해당 오류는 나타나야 할 페이지에서 사용될 정적인 자원들에 대해서 접근이 불가능한 상태라고 한다.
출처: https://stackoverflow.com/questions/61029340/spring-security-redirects-to-page-with-status-code-999/61029341

코드를 다시 보고 실행한 뒤 새로고침 했더니 이번에는 이런 오류가 발생했다.

해당 오류는 Tomcat을 사용할 때, 구동 시간이 너무 오래걸린다 ~ 는 의미의 오류였다.

이리저리 시도해도 해결이 되지 않아서, 프로젝트를 처음부터 다시 만들어보기로 했다.
순차적으로 작성하고 테스트를 거치면서 동작이 잘 되는 것을 확인하던 와중에, 오류가 또 발생했다.

이건 또 뭐야 ...
지원되지 않는 JWT 토큰을 사용했나보다 .. 오류 내용을 검색해보았다.
같은 오류가 나셨던 분이 계셔서 그 방법대로 해결해보기로 했다.

private final로 선언해주지 않아서 spring에서 Bean을 주입하지 못했다고 한다.
하지만 나는 .. 주입할 Bean을 private final로 잘 선언해 두었었다 ..
그에 따른 생성자도 잘 만들어두었다.
출처: https://oh-sh-2134.tistory.com/86

3) 해결

전체적으로 실행이 제대로 안되는 문제를 해결하고 싶어서
프로젝트도 다시 만들고, 실행도 여러번 하고, 강의도 다시 듣고, 코드도 여러 번 읽었는데
정말 의외의 곳에서 오타가 났다 ..

Jwts.parser().setSigningKey(key).parseClaimsJwt(token);

.. 잘 안보면 모르겠지만

Jwts.parser().setSigningKey(key).parseClaimsJws(token);

이렇게 작성해야 한다 ..
parseClaimsJwt가 아니라, parseClaimsJws 명령어이다.

아마 코드를 직접 쓰다보니까, 자동완성 되는 바람에 더 확인하지 않고 넘어갔던 것 같다.

자세히 보면, Jwt< Header, Claims >와 Jws< Claims >로 다르다..!

내가 사용하는 것은 서버의 Private Key로 한 것을 토큰으로 변경한 JWS 이다.
따라서 여기서 Jwt를 사용하게 되면 UnsupportedJwtException 예외가 발생한다고 한다.

출처: https://velog.io/@dasd412/JWT-%ED%86%A0%ED%81%B0-%EB%B0%9C%EA%B8%89-%EC%BD%94%EB%93%9C-%EB%B6%84%EC%84%9D-%EB%B0%8F-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0
출처: https://velog.io/@junho5336/SpringBoot-JWT-%EC%A0%81%EC%9A%A9

4) 배운 점

코드를 볼 때, 잘 보고 작성해야 한다..
Jwts로 시작하는 코드라 Jwt 메서드를 사용해도 괜찮을 거라고 생각했는데,
Jws 메서드를 사용해야 한다는 점을 알게 되었다.

문제2 - test 코드 실행 중 테이블 오류

1) 문제

at java.base/java.util.HashMap.forEach(HashMap.java:1421) ~[na:na]
	at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:140) ~[hibernate-core-6.2.2.Final.jar:6.2.2.Final]
	at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) ~[hibernate-core-6.2.2.Final.jar:6.2.2.Final]
...

신기한 오류가 발생했다 ..

2) 시도

MYSQL server version .. 어쩌구 라는 내용이 적혀있길래 mysql이 작동이 안되는 건가 ? 싶어서
build.gradle 파일을 다시 살펴보았다.
하지만 필요한 것들은 다 적고 build를 완료한 상태였다.

3) 해결

그렇다면 ..? 또 다른 코드를 작성하다가 오타를 냈나 .. 싶었는데 정답이었다.

...
@Table(name = "order")
public class Order{
...
}

이렇게 작성했다 ..

...
@Table(name = "orders")
public class Order {
...
}

order이 아니라 orders 를 테이블 명으로 했어야 했다 ..!

4) 배운 점

테이블 명을 잘못 작성하면 ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command .. 라는 내용의 오류가 발생한다는 점을 알게 되었다.

문제3 - 날짜 삽입 안됨

1) 문제

@Entity로 선언한 클래스에서 날짜 필드를 새로 만들어주고, 테스트 하는 과정에서 오류가 발생했다.
다른 필드들의 값은 잘 삽입되었는데, order_date만 ..!!
date만 들어가지 않았다 ..!!!!!

2) 시도

문제를 찾아보니, 해당 어노테이션을 사용하기 위해서 따로 삽입해주어야 하는 어노테이션들이 있었다.
코드를 보면서 다 따라서 작성했던 내용인데 빼먹은 부분이 있을까 싶어 다시 보았다.
출처: https://wakestand.tistory.com/937

(1) Application 클래스에 @EnableJpaAuditing 어노테이션 삽입
main 메소드가 들어있는 Application 클래스 상단에 해당 어노테이션을 삽입해주어야 한다.

(2) Entity 클래스에 @EntityListeners(AuditingEntityListener.class) 삽입
@CreatedDate와 @LasModifiedDate 어노테이션을 단 컬럼을 사용하려는 경우 해당 클래스 상단에 해당 어노테이션을 삽입해주어야 한다.

3) 해결

해당 오류는 @CreatedDate와 @LastModifiedDate 에노테이션을 사용하는 경우에
발생할 수 있는 오류라고 한다.

두 가지 어노테이션을 잘 삽입한 줄 알았건만 ..

이걸 엉뚱한 곳에 삽입해서 일어난 오류였다 .. ^^
Application 클래스에 넣어야 하는데 ApplicationTest 클래스에 삽입했다 ..

4) 배운 점

필요한 어노테이션을 제대로 삽입해주지 않으면 값이 null로 들어갈 수 있다는 점을 확인할 수 있었다.
또한 엔티티에 설정한 컬럼 명이 잘못된 경우에도 null 값이 들어갈 수 있다고 한다!

profile
(❁´◡`❁)

0개의 댓글