Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[20기_김연수] Spring DB 모델링과 JPA 미션 제출합니다. #1

Merged
merged 8 commits into from
Sep 26, 2024

Conversation

juanxiu
Copy link
Contributor

@juanxiu juanxiu commented Sep 19, 2024

No description provided.

@juanxiu juanxiu changed the title [20기_김연수] spring_instagram 미션 제출합니다. [20기_김연수] Spring DB 모델링과 JPA 미션 제출합니다. Sep 19, 2024
Copy link

@nimikgnoej nimikgnoej left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2주차 과제 하시느라 고생하셨습니다!

Comment on lines +48 to +53
public Post(String caption, String imageUrl, LocalDateTime createdAt, User user) {
this.caption = caption;
this.imageUrl = imageUrl;
this.createdAt = createdAt;
this.user = user;
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lombok 에서 제공하는 각종 생성자 관련 어노테이션들에 대해서 찾아보시면 좋을 것 같습니다!

Comment on lines 7 to 9
@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JpaRepository 를 extends 하지 않고 EntityManager 를 사용하여 코드를 구현해보는 것은 어떨까요?

datasource:
url: jdbc:mysql://localhost:3306/Instagram
username: root
password: juanxiu14!

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

실제 프로젝트를 진행할 때에는 password 를 환경변수 처리하셔야 합니다!

Copy link

@limgahyun limgahyun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2주차 과제 하시느라 고생하셨습니다 !!! 제가 생각해보지 못했던 구조나 기능들이 꽤 있어서 흥미로웠고 덕분에 더 고민해볼 수 있었던 것 같아요 :)

gitignore.txt Outdated

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gitignore가 잘 적용되지 않은 것 같아요!

  1. 파일명을 .gitignore로 변경하신 후
  2. git에 적용되도록 업데이트
git rm -r --cached .
git add .
git commit -m "commit message"
git push

이렇게 하시면 반영되더라구요! 저도 같은 문제를 겪었어서 도움이 될까싶어 공유드립니다!

Comment on lines 30 to 33
@OneToMany(
mappedBy = "user"
)
private Set<Post> caption = new HashSet();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

caption속성은 어떤걸까요?? 한 user가 작성한 post들인가요?! 맞다면 caption보다 posts와 같은 이름이 조금 더 직관적일 것 같다는 생각이 들어요!

Comment on lines 55 to 64
public boolean equals(Object o) {
if (this == o) {
return true;
} else if (o != null && this.getClass() == o.getClass()) {
Post post = (Post)o;
return Objects.equals(this.postId, post.postId);
} else {
return false;
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 코드에서 equals를 사용하고 있지는 않은 것 같은데 어떤 경우에 사용되는 기능인지 궁금합니다!

Copy link

@choiseoji choiseoji left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고민한 점을 주석으로 꼼꼼하게 작성하신 점이 인상 깊었습니다.. 코드를 정말 열심히 작성하신게 느껴져요! 수고하셨습니다 🙌

Comment on lines +17 to +18
@Temporal(TemporalType.TIMESTAMP)
private LocalDateTime createdAt;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Temporal 어노테이션은 처음 봐서 신기했습니다!!
찾아보니 LocalDateTime을 쓸 때는 timestamp를 자동으로 지정해줘서 생략 가능하다고 합니다!

Comment on lines +33 to +39
public ChatMessage(String content,User userId, Chatroom roomId){
this.content = content;
this.userId = userId;
this.roomId = roomId;
this.createdAt = LocalDateTime.now(); // 생성 시점에 자동으로 객체 생성 설정.

}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 인스턴스 생성할 때 시간을 직접 넣어주려고 했는데, 자동으로 설정되는 코드가 더 좋아보이네요! 참고하겠습니다!!

Comment on lines +4 to +29
/*
fromUser: 팔로우 관계를 요청하는 사용자
toUser: 다른 사용자에 의해 팔로우 관계가 생성되는 사용자
```
private List<Long> followerList;
private List<Long> followingList;
```
위와 같이 "유저 엔티티 안에서 리스트로 "구현하지 않은 이유는?
만약 apple 사용자가 kiwi 사용자를 팔로우 하려고 한다. 이를 처리하기 위해 아래 과정을 거처야 한다.

apple 사용자에 followingList 에 kiwi 사용자를 추가한다.
kiwi 사용자에 followerList 에 apple 사용자를 추가한다.
즉, apple 사용자에 의해 발생되는 문제를 해결하기 위해 kiwi 사용자의 원본 객체에 접근한다는 것은 안전하지 않다고 판단해 해당 방법으로 구현하지 않았다.

(근데 .. 하 ... followId(receiverId) / followingId(senderId) 로 해야 하나..? )
이유: 한 사람은 여러 명에게 팔로우 요청을 할 수 있을뿐만 아니라 여러명에게 팔로우 요청을 받을 수 있다.
즉, from_user와 to_user는 다대다 관계라는 것이다.

이때, 우리는 일대다, 일대일 관계에서 @OneToMany, @OneToOne 어노테이션을 사용하는 것처럼
다대다 관계에서도 @ManyToMany 어노테이션을 사용하는 것을 고려할 수 있다.

하지만 @ManyToMany 어노테이션은 사용을 권장하지 않는다.
왜냐하면 @ManyToMany 어노테이션을 사용할 경우 내부적으로 중간 테이블이 생성되어 개발자가 알지 못하는 쿼리가 발생하기 때문이다.
또한 생성된 테이블에 필요한 컬럼을 추가할 수 없어 유지·보수가 불편하다.

이런 경우 연결 Entity를 직접 생성하는 것이 권장된다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고민한 내용을 적어주신 점이 인상깊습니다,,
저는 별 생각없이 필드를 작성했는데 앞으로 저도 어떤 방법이 더 좋을까 고민해야겠어요!

Comment on lines +32 to +40
//ID로 엔티티 조회.
public <T> Optional<T> findById(Class<T> clazz, Long id) {
return Optional.ofNullable(em.find(clazz, id));
}

// 모든 엔티티 조회.
public <T> List<T> findAll(Class<T> clazz){
return em.createQuery("select u from "+clazz.getSimpleName()+" u", clazz).getResultList();
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헉 제네릭 타입으로 구현하셨네요! 꼭 PostRepository가 아니더라도 공통적으로 사용할 수 있을것 같아 좋아보여요!

Comment on lines +30 to +54
@Nested
@SpringBootTest
@AutoConfigureTestDatabase(
replace = Replace.NONE
)
@Transactional
class PostRepositoryTest {
@Autowired
private com.ceos20.instagram.Repository.postRepository postRepository;
@Autowired
private UserRepository userRepository;

PostRepositoryTest() {
}

@DirtiesContext
@Test
void save_test() throws Exception {
//given - 유저 생성
User user = new User("testUser1", "password1");
userRepository.save(user);
// given - 게시물 생성
LocalDateTime date = LocalDateTime.of(2024, 9, 11, 0, 0, 0);
Post post1 = new Post("Post Caption 1", "ImageURL1", date, user);
Post post2 = new Post("Post Caption 2", "ImageURL2", date, user);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nested, @DirtiesContext 등 제가 모르는 어노테이션이 많네요..한번 찾아봐야겠어요,, 저와 다르게 Mockito를 사용하셔서 다양한 테스트 방법을 볼 수 있었습니다!

@limbs713 limbs713 merged commit 77ef798 into CEOS-Developers:juanxiu Sep 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants