[JPA,SpringBoot] KnockKnock 개발일지 - 1201

Hyebin Lee·2021년 12월 1일
0

knockknock 개발일지

목록 보기
3/29
post-thumbnail
post-custom-banner

✔오늘의 목표와 진행

  1. Service와 Controller 부분 구현하기
  2. Service에 해당하는 Test 코드 작성하기 -> 작성하다 막힘 delete 부분

Android 진행 언제하니 ㅠㅠㅠㅠㅠ 😥😥😣

  1. Android 연동하기
  2. Android에서 UI 없이라도 Post 유저 input 받아서 output 찍어보기

오늘의 이슈

오늘부터 다시 볼 날을 기약하며 정확히 해결이 안되었거나 나중에 다시 더 공부할 필요가 있는 부분은 끝에 💥 이모티콘으로 표시해두기로 했음 ㅎㅎㅎㅎ 🥰 파이팅하자 나 자신아

  1. 객체와 테이블 간의 관계
    : 데이터베이스에서 삭제하고 Entity 객체 단위에서도 삭제가 필요한가?
  2. Dto 와 Form의 차이
  3. Entity <-> Dto 변환은 어디서 해줘야 하나? 💥
  4. SpringBoot 에서 log 찍기
  5. 해시태그 삭제 이슈 💥
    (글 삭제하면 해당 글로 인해 생성된 해시태그 중 다른 글과 참조가 안되어 있는 해시태그는 삭제,, 하려고 함)

1. 객체와 테이블 간의 관계

객체와 테이블 매핑이 가끔 헷갈릴 때가 있는데 따로 공부해서 깔끔하게 정리했다.
간단하게 생각하면 쉬움.

  1. 일단 엔티티 객체를 만들기만 한 것 -> 비영속성 상태
    em.persist(엔티티 객체) 해줘야지만 영속성 컨텍스트에 관리되고 테이블에 저장된다. 그와 동시에 해당 엔티티 객체의 멤버필드 등 객체의 내용과 동일한 것들이 DB에 저장되고 매핑됨
  2. 이후부터 엔티티 객체 자체는 매핑했던 DB의 내용을 객체 상태로 가져옴. 이때 이미 매핑된 객체는 update 하거나 delete 할 때 따로 다시 em로 접근할 필요가 없음. 그냥 em에서 조회하는거 자체가 영속성 컨텍스트에서 관리하고 있기 때문에 자동 dirtychecking이 됨
  3. 따라서 update 기능을 수행하려면 em.find로 필요한 엔티티 DB 정보를 엔티티 객체로 받아온 후 해당 객체에서 원하는 내용을 수행하면 됨.
  4. DB와 객체는 서로 매핑되어있기 때문에 영속성 컨텍스트 상에서 관리하는 객체가 수정될 경우 dirtychecking으로 DB에도 그 내용이 자동 반영되고 DB에서 어떤 객체의 특정 내용이나 연관관계 매핑된 외부 entity를 삭제할 경우 객체에서도 자동으로 해당 멤버필드 값이 지워지게 된다.

2. Dto 와 Form 의 차이

Form은 유저 인터페이스에서 받을 Class
Dto 는 핵심 API에서 왔다갔다할 정보 Class 들 ( Entity 감싸개 용)

만약에 UI가 핵심 API 기능과 일치하다면 굳이 Dto 와 Form Class를 나눌 필요는 없음! 😎

3. Entity <-> Dto 변환 장소 💥

이거는 내가 속해있는 유쾌한 스프링방이라는 스프링 오픈카톡채팅방에 올라온 질문이였는데 갑자기 궁금해져서 나도 생각해보게 되었다..ㅎㅎㅎㅎ
본 개발이나 충실할 것이지 사고의 흐름 삼천포로 빠지는거 세상에서 제일 잘함🤸‍♀️

여튼!! Entity 를 Dto 로 바꿔주고 Dto를 Entity로 바꿔주는 것을 어디서 하면 좋을지에 대해 단톡방에서 나온 의견은
레이어 아키텍쳐를 준수하기 위해서 Entity를 Dto로, Dto를 Entity로 변환해주는 것은 Controller 에서 처리하는게 좋다 였다.
레이어 아키텍쳐 면을 고려했을 때는 이게 맞는 것 같다.
그런데 왠지 Entity를 프레젠테이션 레이어까지 끌고오는게 불안한데 😧 Entity를 Controller까지 끌고와도 문제되는 부분이 없는지 모르겠다.

Req, Res를 어디까지 가져올 예정인지에 따라 달라지겠지만 말이다. 음 근데 어디까지 가져오냐에 따라 성능이나 기능이 많이 달라지나? 아직 궁금하고 모르는 부분이 많다 ㅠㅠㅠ

4. SpringBoot 에서 Log 찍기

이것은.. 정말 바보같은 뻘짓을 했다....ㅎㅎㅎ 이 간단한 log찍는데 왜이렇게 많은 시간을 허비했는지 모르겠다..
앞으로 log는 정말 누구보다 빨리 찍어낼 것이다.. 두 번의 삽질은 용납하지 않아😣

private final Logger logger = LoggerFactory.getLogger(PostServiceTest.class);

일단 기본적으로 SpringBoot에서 자동으로 slf4j 를 의존성으로 갖고 있기 때문에 굳이 따로 설정해줄 것은 없다.
그냥 Logger Class와 LoggerFactory Class import 할 때 패키지가 slf4j 패키지 클래스인지만 잘 확인해서 import 해주면 된다.

이러고 로그 찍을 때는

logger.info("어쩌구")

요런식으로 하면 끝! SIMPLE

그래.. 나도 내가 대체 왜 이런 걸로 시간 낭비했는지 알고 싶지 않아....요
대체 뭐로 뻘짓했냐 하면,,, Test 에서 로그 찍어볼 때
아무리 찾아봐도 내가 찍으려던 log가 log기록에 없길래 뭐지뭐지 했는데


음...오..아..예..,,,,
위에 Test Class log 내용이랑 Test 메소드(글삭제) log 내용이 다르더라구........????!!!
바보같이 열심히 Test Class(상위 log부분) 만 뒤져가며 내가 쓴 로그 어딨나 눈알 빠지게 찾았는데,,
Test 메소드(이 경우에는 '글삭제') 안에서 찍은 log는 저 메소드 내용에서 log를 찾아주어야 하더라....

그래.. 다음부터 뻘짓 안하면 되지,. 괜찮아 괜찮아

5. 해시태그 삭제 이슈 💥

문제의 코드....

 public void delete(Long id){
        Post post = postRepository.findOneById(id);
        List<PostHashTag> hashTags = post.getPostTags();
        for(PostHashTag PosthashTag: hashTags ){
            String tag = PosthashTag.getTag();
            HashTag hashtag=hashTagRepository.findByTag(tag);
            if(hashtag.getPostHashTags().isEmpty())hashTagRepository.remove(hashtag);
        }
        postRepository.remove(post);
    }

의도한 내용은 게시글을 삭제할 때 해당 게시글로 인해 생성된 해시태그 중
다른 글과 참조가 아예 안되어있는 해시태그들은 아예 해시태그에서 삭제... 하려고 했음
근데 저 코드 결과 돌려보면 게시글을 삭제할 때 해당 게시글에 있는 해시태그가 모두 삭제되어 버림,, 그 해시태그가 다른 글에 PostHashTag로 연결되어 있어도 ㅠㅠ

분명히 hashtag.getPostHashTags().isEmpty()로 다른 글과의 참조가 있는지 없는지 구분을 했건만,, 이 함수가 먹히지 않는 것 같다 ㅠㅠㅠ 왜일까...

public void addHashTag(HashTag hashTag){
        PostHashTag postHashTag = new PostHashTag();
        postHashTag.setTag(hashTag.getTag());
        postHashTag.setPost(this);
        hashTag.getPostHashTags().add(postHashTag); // 이부분
        this.getPostTags().add(postHashTag);
    }

찾아보니 표시된 부분을 추가 안한게 문제인 것 같았다.
애초에 HashTag 의 List PostHashTag 부분에서 배열 원소를 추가한 적이 없는 것이다. 그러니까 당연히 hashtag의 모든 posthashtag 리스트는 empty일 수밖에...
그래서 해당 코드를 추가했는데,,도,,,, 로그로 찍어보니까 hashtag의 모든 posthashtag 리스트가 empty 상태였다 ㅠㅠㅠㅠㅠ

마치며

오늘은 시간이 너무 늦어서 일단 여기까지 하고 자야겠다 ㅠ
대체 안드로이드 연동은 언제한담 ㅠㅠ 이번주 내로 값이라도 안드로이드에 찍어볼 수 있을까
내일은 알바랑 졸업프로젝트 스케줄이 빡빡해서 못할거 같고
하,,, 금요일날에는 이 문제가 해결되길 바라며... 오늘 개발일지는 여기까지 😴😭

post-custom-banner

0개의 댓글