일주일동안 나는 웹소켓 , 프론트엔드 , 채팅방 api 만들었다.
직접 사용자들에게 구글폼도 날려보며 냉정한 평가도 얻었다.
그리고 팀원들과 함께 열심히 프론트도 고쳤다
프론트 쉽지않당 ,,, ㅠㅠ
12/16 오늘은 채팅방 전체 인원 수 보이게 하고 nav통일하고 rooms 프론트 꾸몄다 .. 그리고 지금은 채팅방 나가기 기능을 구현하고 있는데 오류가 발생했다 .. 그리고 굉장히 되고싶었던 것을 탈락했다 ㅎ 하하
12/17
일어나서 수강신청을 못했다 다 나 게으름탓이다 ㅠ ㅠ
그리고 연관관계 jpa 고쳤는데 완전 어이없는 실수를 했다
mappedby 에 대문자로 써서 ㅋㅋ
우선 서버오류를 보는데 마지막 100줄 해도 잘 안보여서 결국 압축파일을 다운받아야만 했다는 슬픈 사연 ,,
어쨋든 무슨 에러냐면 대충이럼ㅋ
nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause
대충 이런 오류가 떴는데 내가 채팅방 삭제를 하면서 연관관계에서 생긴 오류 같았다.
ChatRoom 을 삭제하면 ChatRoom 을 외래키로 가지고 있는 ChatUser도 삭제가 되어야하는데 여기서 오류가 발생한 것 같았다
package com.cdp.tdp.chat.domain;
import com.cdp.tdp.chat.dto.ChatRoomDTO;
import com.cdp.tdp.domain.Comment;
import com.cdp.tdp.domain.Timestamped;
import com.cdp.tdp.domain.User;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Setter
@Getter
@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.
@Entity // 테이블임을 나타냅니다.
public class ChatRoom extends Timestamped {
@Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
@GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
private Long roomId;
@Column // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
private String name;
@Column
private int count;
@JoinColumn(name = "USER_ID" )
@ManyToOne
private User user; //룸 개설자
@JsonIgnore
@OneToMany(mappedBy = "chatRoom", cascade = CascadeType.REMOVE)
private List<ChatUser> chatUsers;
public ChatRoom(ChatRoomDTO chatRoomDTO,User user) {
this.name = chatRoomDTO.getRoomName();
this.count=0;
this.user=user;
}
}
package com.cdp.tdp.chat.domain;
import com.cdp.tdp.domain.Comment;
import com.cdp.tdp.domain.Til;
import com.cdp.tdp.domain.Timestamped;
import com.cdp.tdp.domain.User;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter // get 함수를 일괄적으로 만들어줍니다.
@Entity // DB 테이블 역할을 합니다
public class ChatUser extends Timestamped {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long id;
@JoinColumn(name = "USER_ID", nullable = false)
@OneToOne
private User user;
@JoinColumn(name = "ROOM_ID", nullable = false )
@ManyToOne
private ChatRoom chatRoom;
public ChatUser(User user, ChatRoom chatRoom) {
this.chatRoom=chatRoom;
this.user = user;
}
나는 글에 대한 comment와 like 수를 til_board에 표시해주기로 햇다.
우선 til 에 대한 코멘트와 라이크를 받아와야했는데 comment 가 받아와지지 않았다 ..
나는 다시 지옥에 들어갔다 .. 대체 뭐가 문제일지 생각해봤다.
til과 comment 는 연관관계로 매핑되어있으니 글이 생성되면 코멘트가 자동으로 생성되어야 맞는 거 아닌가 ? 라는 생각이 들었다 ㅠ ㅠ
하지만 머리를 잘 굴려보니 내가 개 멍청이였다.
tag와 같은 경우는 dto에서 받아오기 때문에 글이 생성되면서 같이 생성되짐나 comment 는 글이 생성됨과 동시에 생성될 수 없으므로 글만 쓰고 조회했을 때는 정보를 받아올 수 없었다
무슨 말인지 코드를 보면 알 것이에요
package com.cdp.tdp.domain;
import com.cdp.tdp.dto.TilRequestDto;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import java.util.List;
@Setter
@Getter
@NoArgsConstructor
@Entity
public class Til extends Timestamped {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
@Column(name = "til_id")
private Long id;
@Column(nullable = false)
private String tilTitle;
@Column(nullable = false)
private String tilContent;
@Column(nullable = false)
private boolean tilView;
@Column(nullable = false)
private int tilLike;
@Column(nullable = false)
private int num_comment;
@JoinColumn(name = "user_id")
@ManyToOne
private User user;
@JsonIgnore
@OneToMany(mappedBy="til", cascade = CascadeType.REMOVE)
private List<Comment> comments;
@OneToMany(mappedBy="til", cascade = CascadeType.REMOVE)
private List<Tag> tags;
public Til(Long id, String tilTitle, String tilContent, boolean tilView, int tilLike, int num_comment,User user, List<Comment> comments, List<Tag> tags) {
this.id = id;
this.tilTitle = tilTitle;
this.tilContent = tilContent;
this.tilView = tilView;
this.tilLike = tilLike;
this.user = user;
this.comments = comments;
this.tags=tags;
this.num_comment=num_comment;
}
@Builder
public Til(TilRequestDto tilRequestDto, User user) {
this.tilTitle = tilRequestDto.getTilTitle();
this.tilContent = tilRequestDto.getTilContent();
this.tilView = tilRequestDto.isTilView();
this.user = user;
}
public void updateMyTil(TilRequestDto tilRequestDto){
this.tilTitle= tilRequestDto.getTilTitle();
this.tilContent=tilRequestDto.getTilContent();
}
public void updateMyTilView(){
tilView = !(tilView);
}
}
그니까 난 여기서 연관관계가 있기 때문에 til이 생성되면 자동으로 comment도 생성되는 줄 알았던 것이다 개멍청이
아니라는 것을 깨닫고 얼른 this.num_comment=num_comment; 을 속성으로 넣어주었고 comment 가 생성될 때마다 til의 num_comment; 도 update 시켜주었다.
이 방식으로 하니까 되었다 ㅎㅎ
고민이 좀 많아진 것 같다 ㅠ ㅠ
1,2 월 시간이 비는데 무엇을 해야 의미있을 지 모르겠다
일단 내 일출일몰 프로젝트 먼저 spring으로 convert하고 싶다 ..ㅋ
그리고 코딩테스트 준비를 열심히 해야할 것 같고 공모전에도 나가면 좋을 것 같다
사실 인턴을 뭐라도 해봐야하나 라는 고민이 된다 ....
악
ㅎㅎ
내가 사개월동안 열심히 노력한게 헛되지 않게 1,2월을 보내고 싶고 유종의미를 거두고싶다 !!