[내일배움캠프] #211217 💻 TIL 💻

이수영·2021년 12월 17일
0

MY TIL 

목록 보기
50/50
post-thumbnail

📚 Springboot

✍🏻 요즘 내가 개발하고 있는 것들

일주일동안 나는 웹소켓 , 프론트엔드 , 채팅방 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도 삭제가 되어야하는데 여기서 오류가 발생한 것 같았다

🚫 Problem And Solution 1

✔ chatRoom

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;

    }

}
  • 문제 1:
    저기 chatUsers 위에 chatRoom 을 내가 대문자(ChatRoom)로 써서 심지어 이 문제는 build되지도 않았다. 아주 까다로운 놈임
    연관관계를 잘 생각해보아야한다^^

✔ chatUser

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;
    }

  • 문제 2
    지금은 해결됐지만 내가 ChatUser에서 ChatRoom 을 OnetoOne으로 하고 있었다 ChatUser는 한 사람당 많은 채팅방에 참가할 수 있는데 말이다

🚫 Problem And Solution 2

나는 글에 대한 comment와 like 수를 til_board에 표시해주기로 햇다.
우선 til 에 대한 코멘트와 라이크를 받아와야했는데 comment 가 받아와지지 않았다 ..
나는 다시 지옥에 들어갔다 .. 대체 뭐가 문제일지 생각해봤다.
til과 comment 는 연관관계로 매핑되어있으니 글이 생성되면 코멘트가 자동으로 생성되어야 맞는 거 아닌가 ? 라는 생각이 들었다 ㅠ ㅠ
하지만 머리를 잘 굴려보니 내가 개 멍청이였다.

tag와 같은 경우는 dto에서 받아오기 때문에 글이 생성되면서 같이 생성되짐나 comment 는 글이 생성됨과 동시에 생성될 수 없으므로 글만 쓰고 조회했을 때는 정보를 받아올 수 없었다

무슨 말인지 코드를 보면 알 것이에요

✔ Til

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 시켜주었다.
이 방식으로 하니까 되었다 ㅎㅎ

My Future ?

고민이 좀 많아진 것 같다 ㅠ ㅠ
1,2 월 시간이 비는데 무엇을 해야 의미있을 지 모르겠다

일단 내 일출일몰 프로젝트 먼저 spring으로 convert하고 싶다 ..ㅋ
그리고 코딩테스트 준비를 열심히 해야할 것 같고 공모전에도 나가면 좋을 것 같다
사실 인턴을 뭐라도 해봐야하나 라는 고민이 된다 ....

ㅎㅎ
내가 사개월동안 열심히 노력한게 헛되지 않게 1,2월을 보내고 싶고 유종의미를 거두고싶다 !!

profile
Hongik Univ 💻

0개의 댓글