스프링부트 입문기 #5 - 엄청난 삽질 해결기

HanSH·2023년 7월 5일
1

SpringBoot 삽질기

목록 보기
7/12

데이터를 작성하고...
새로운 컬럼을 만들고...
여러 지랄들을 하면서...

저는 말하는 싹 난 감자입니다를 다시금 체감하였다.

결과만 말하면 Board와 User에서 서로의 Join관계를 정해주지 않아 발생한 문제였다.
해결한 소스코드는 이쪽으로

당시 테이블 상태를 보여주면...

// Board.java
@Entity
@Data
public class Board {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String description;

    @Column
    @CreationTimestamp
    private LocalDateTime createTime = LocalDateTime.now();

    @OneToMany(mappedBy = "board", cascade = CascadeType.REMOVE)
    private List<Post> posts;

    private User user;
}
// User.java
@Data
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @Column
    @CreationTimestamp
    private LocalDateTime createDate = LocalDateTime.now();

    @Column
    @UpdateTimestamp
    private LocalDateTime breakDate = LocalDateTime.now();

    @OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
    private List<Post> posts;

    @OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
    private List<Comment> comments;
}

이렇게 되어있다.
여기서 답을 찾는다면 당신은 개고수!

삽질 0. @#Timestamp 관련

@CreationTimestamp 와 @UpdateTimestamp 는 같이 못쓰더라...

삽질 1. JDBC LocalDateTime

테이블을 만들고
레포지터리 수정하고
뇌속에서 시뮬레이션 하고
서비스, 컨트롤러 만들고
뇌속에서 다시 시뮬레이션하고

실행을 했다?

org.hibernate.type.descriptor.java.spi.JdbcTypeRecommendationException: Could not determine recommended JdbcType for `com.example.demo.user.User`

나를 반겨주는건 오류뿐이었다.
왜지...

MySQL JDBC 문제인가..?
해당 JDBC에서 문제가 있나..?
싶어 GPT에도 물어보고 구글에도 검색해봤더니 결과는

@Column(columnDefinition = "TIMESTAMP") 적용해보세요~
@Temporal(TemporalType.TIMESTAMP) 추가하세요~

테이블이 없으면 @OneToMany 이런거에서 참조할 수 없어용~

이것 뿐.
추후에 알게됐지만, 정답에 가장 가까웠던 결과는

@OneToMany(mappedBy = "user")
@ManyToOne

쪽이었다.

혹시 모르니 다른 테이블을 참조하는 모든 코드들을 주석처리하고 서버를 실행했더니...

!!! 테이블이 정상적으로 생성되었다!
일단 LocalDateTime 문제는 아니었던걸로.

삽질 2. Join 문제

흠...
위에서 정상적으로 만들어졌는데 왜 저거만 안되지..?
하나씩 주석을 풀어볼까?

어?
Board쪽에서 private User user;를 주석 해제하니 오류가 발생하네?

제시해주신 Board 엔티티 클래스에는 User와의 연관 관계가 선언되어 있지 않습니다. 
User와 Board 간의 관계를 매핑하기 위해 @ManyToOne 어노테이션을 사용하여 매핑해보겠습니다.

아...
허무하게 해결되었다.

결론은 테이블에 단순 참조라 하더라도, 연관 관계를 선언해줘야 한다는 것이었다.

삽질 3. Swagger

swagger 페이지가 필요하겠다 싶어 적용 가능한 라이브러리를 찾아봤다. 후보군으로는

  • spring-fox
  • spring-doc

이 2가지.

spring-fox는 검색 결과를 그대로 써도 적용이 안됐는데, Spring Boot 2.6 이상에서는 제대로 적용 안된다고 한다...(SpringBoot 3.1.1 사용중)
spring-fox를 적용시키려고 별 짓을 다 해봤는데 내 시간만 잡아먹고 실패.

남은건 spring-doc.
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' 이 의존성만 추가해주니 잘 되더라...

profile
저는 말하는 싹 난 감자입니다

0개의 댓글