- Service와 Controller 부분 구현하기
- Service에 해당하는 Test 코드 작성하기 -> 작성하다 막힘 delete 부분
Android 진행 언제하니 ㅠㅠㅠㅠㅠ 😥😥😣
- Android 연동하기
- Android에서 UI 없이라도 Post 유저 input 받아서 output 찍어보기
오늘부터 다시 볼 날을 기약하며 정확히 해결이 안되었거나 나중에 다시 더 공부할 필요가 있는 부분은 끝에 💥 이모티콘으로 표시해두기로 했음 ㅎㅎㅎㅎ 🥰 파이팅하자 나 자신아
- 객체와 테이블 간의 관계
: 데이터베이스에서 삭제하고 Entity 객체 단위에서도 삭제가 필요한가?- Dto 와 Form의 차이
- Entity <-> Dto 변환은 어디서 해줘야 하나? 💥
- SpringBoot 에서 log 찍기
- 해시태그 삭제 이슈 💥
(글 삭제하면 해당 글로 인해 생성된 해시태그 중 다른 글과 참조가 안되어 있는 해시태그는 삭제,, 하려고 함)
객체와 테이블 매핑이 가끔 헷갈릴 때가 있는데 따로 공부해서 깔끔하게 정리했다.
간단하게 생각하면 쉬움.
Form은 유저 인터페이스에서 받을 Class
Dto 는 핵심 API에서 왔다갔다할 정보 Class 들 ( Entity 감싸개 용)
만약에 UI가 핵심 API 기능과 일치하다면 굳이 Dto 와 Form Class를 나눌 필요는 없음! 😎
이거는 내가 속해있는 유쾌한 스프링방이라는 스프링 오픈카톡채팅방에 올라온 질문이였는데 갑자기 궁금해져서 나도 생각해보게 되었다..ㅎㅎㅎㅎ
본 개발이나 충실할 것이지 사고의 흐름 삼천포로 빠지는거 세상에서 제일 잘함🤸♀️
여튼!! Entity 를 Dto 로 바꿔주고 Dto를 Entity로 바꿔주는 것을 어디서 하면 좋을지에 대해 단톡방에서 나온 의견은
레이어 아키텍쳐를 준수하기 위해서 Entity를 Dto로, Dto를 Entity로 변환해주는 것은 Controller 에서 처리하는게 좋다 였다.
레이어 아키텍쳐 면을 고려했을 때는 이게 맞는 것 같다.
그런데 왠지 Entity를 프레젠테이션 레이어까지 끌고오는게 불안한데 😧 Entity를 Controller까지 끌고와도 문제되는 부분이 없는지 모르겠다.
Req, Res를 어디까지 가져올 예정인지에 따라 달라지겠지만 말이다. 음 근데 어디까지 가져오냐에 따라 성능이나 기능이 많이 달라지나? 아직 궁금하고 모르는 부분이 많다 ㅠㅠㅠ
이것은.. 정말 바보같은 뻘짓을 했다....ㅎㅎㅎ 이 간단한 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를 찾아주어야 하더라....
그래.. 다음부터 뻘짓 안하면 되지,. 괜찮아 괜찮아
문제의 코드....
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 상태였다 ㅠㅠㅠㅠㅠ
오늘은 시간이 너무 늦어서 일단 여기까지 하고 자야겠다 ㅠ
대체 안드로이드 연동은 언제한담 ㅠㅠ 이번주 내로 값이라도 안드로이드에 찍어볼 수 있을까
내일은 알바랑 졸업프로젝트 스케줄이 빡빡해서 못할거 같고
하,,, 금요일날에는 이 문제가 해결되길 바라며... 오늘 개발일지는 여기까지 😴😭