@Entity
@Getter
@Table(name = "comment")
@NoArgsConstructor
public class Comment extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int seq;
@ManyToOne()
@JoinColumn(name = "user_seq")
private User user;
@ManyToOne()
@JoinColumn(name = "schedule_seq")
private Schedule schedule;
@Column(name = "content", nullable = false, length = 300)
private String content;
}
@Data
@Entity
@Table(name = "schedule")
@NoArgsConstructor
public class Schedule extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String seq;
@ManyToOne()
@JoinColumn(name = "user_seq")
private User user;
@OneToMany(mappedBy = "schedule", cascade = CascadeType.PERSIST, orphanRemoval = true)
private List<Comment> comments = new ArrayList<>();
@Column(nullable = false, length = 100)
private String title;
@Column(nullable = false, length = 500)
private String content;
private LocalDate startUpdateDate;
private LocalDate endUpdateDate;
}
@Data
@Entity
@Table(name = "user")
@NoArgsConstructor
public class User extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int seq;
@Column(nullable = false)
private String password;
@Column(nullable = false, length = 30)
private String name;
@Column(nullable = false, unique = true, length = 50)
private String email;
@Enumerated(value = EnumType.STRING)
private AuthType auth;
@OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST, orphanRemoval = true)
private List<Schedule> schedules = new ArrayList<>();
@OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST, orphanRemoval = true)
private List<Comment> comments = new ArrayList<>();
}
이렇게 유저, 일정, 댓글 3개의 테이블을 연관관계를 맺어준 다음에 코드를 실행했는데. 실제로 생성된건 user와 comment 2개의 테이블만 생성이 되었다.

Comment 테이블을 주석처리하고 돌려봤는데 여전히 Schedule테이블이 생성되지 않는다.
public class Schedule extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String seq;
Schedule테이블에서 GenerationType.IDENTITY을 줘놓고 String을 쓰고 있었다.

뭔가 웹 개발은 여기저기 들락거리다보니
(intellij, postman, 웹 브라우저(?) 근데 써놓고 보니 2개밖에 없네여..)
쉬운것도 놓치기 쉬운 것 같다. 로그를 더 열심히 읽어보게 되었다.
alter문이 날아가는 현상하버네이트 옵션을 update로 줬음에도 날짜컬럼이 계속 alter로 수정되었다.
이 문제는 Spring 3.1.?버전에서 발생하는 문제라고 한다. 버전을 올려서 해결했다.
@Getter
@MappedSuperclass // 추상클래스에 선언한 변수를 컬럼으로 인식한다.
@EntityListeners(AuditingEntityListener.class) // 자동으로 시간을 넣어주는 기능 사용 가능
public abstract class Timestamped {
@CreatedDate
@Column(updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private LocalDateTime createDate;
@LastModifiedDate
@Column
@Temporal(TemporalType.TIMESTAMP)
private LocalDateTime updateDate;
}
cteate_date와 갱신날짜 update_date값을 자동으로 넣어주도록 Timestamped 클래스를 만들어서 상속했지만 무슨짓을 해도 들어가지 않았다. Timestamped와 entitiy클래스들에는 문제가 없어보여서 콘솔창에서 insert쿼리를 직접 작성해서 날려봤는데 날짜를 직접 적었을땐 잘 들어갔다.@EnableJpaAuditing
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class ScheduleProjectApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduleProjectApplication.class, args);
}
}
@EnableJpaAuditing을 붙이지 않았었다.페이징 쿼리가 이상했다. Pageable객체의 page옵션은 0부터 시작해서였다.
외부의 API를 받아 오늘의 날씨를 테이블에 추가하는 기능이 있었다.
튜터님한테 오늘꺼만 가져오는 RestAPI가 있는지 여쭤봐야했는데.. 누가 혼내는 것도 아닌데 왜이렇게 말하는게 어려운지 모르겠다.
일단 Weather은 필요한 컬럼이 하나밖에 없으므로 WeatherDto를 따로 만들진 않고, 365일을 다 가져와서 오늘꺼만 추출하기로 했다.
Json을 파싱하는데 조금 걸렸다. 트리구조처럼 이어지는형태라 헷갈렸던 것 같다.
JSONObject에 있는 get함수들은 해당 컬럼을 get뒤에 이어지는 Type으로 받겠다는 것이다. 예를 들어 아래와 같은 json이 들어왔을 때{
name: "홍길동",
age: 20
}
getString("name")을 하면 name: "홍길동"을 String으로 받아오겠다는 형태이다.
[
{
date: "01-01",
weather: "Sunny"
},
{
date: "01-02",
weather: "Snowy"
}
]
날씨 API로 날씨를 요청하면 위와같은 json이 들어온다.
JSONArray는 배열형태를 가져올때 사용한다. []로 감싸진거. JSONArray는 getJSONObject({idx})를 통해 요소를 뽑아올 수 있다.Weather.json은 배열로 이루어져잇으므로 처음에 body를 가져올때 바로 JSONArray를 사용했고 그다음엔 getObject로 각 날짜별 날씨를 뽑아온 다음 getString("date")로 날짜만 뽑아서 오늘 날짜와 비교했다.
얼기설기 복붙해서 만들고 테스트하는데 너무 막힘없이 잘됐다 그럴리가 없는데!! 이상했다. 로그를 보니jwt인증처리하는 AuthFilter에 @Component를 안붙여서 검사를 수행하고 있지도 않았다. 그 후 jwt는 문제가 너무 많이 생겼어서 정신없이 지나간거 같다. 트러블 슈팅에 이걸 적어야하는데 기억이 나질 않는다......... 앞으로는 바로바로 메모해 둬야겠다.
filter 안에서도 커스텀한 Exception을 반환하고 싶었다.
검색해보니 doFilter안에서 ServletRequest에 setError를 세팅해서 넘기면 된다고 한다. 안된다.
Filter에서 Response 수정하기
위에 포스팅에서 Exception을 커스텀 할 수 있다고하는데 머리가 나빠서 단시간에 적용은 힘들어보였다.
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
String json = objectMapper.writeValueAsString(new ResponseStatusDto(ResponseCode.TOKEN_UNSUPPORTED));
response.getWriter().write(json);
좀더 쉬운방법으로 이것저것 클래스 만들지 않고 반환할 json을 그대로 밀어넣으면 된다고 한다. 일단 제출이 얼마 남지 않았으니 이렇게하고 추후에 보강하기로 했다.
갈수록 트러블이 많아진다. 특히 Filter랑 Cookie기능을 구현하면서 뇌의 한계를 느꼈다.
왜 돼는지도 아직 100%는 이해 못한 것 같다. 내가 짰지만 프로그램을 통제할 수 없다.😇