• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

수업 내용 Fundamental & 파일 관련 질의

23.01.03 15:38 작성 조회수 234

1

안녕하세요 선생님, 또 물어볼 게 생겼어요 ㅠㅠ

  1. 강의에서 컨트롤러는 테스트를 별도로 작성하지 않았는데 해당 부분을 강의에서 제외하신 이유가 뭔지 궁금합니다.

  2. LibraryAppApplicationTest 자바 파일은 코틀린으로 굳이 안바꾸고 Java 빈 폴더를 main에 두고 둘 다 남겨둔 건 서로 호환이 되는 걸 보여주려고 하신 건가요?

  3. 지난 번에 제가 JPA 단점을 여쭤봤는데 선생님은 JPA를 안 쓰면 안 좋은 점을 알려주신 것 같아 찾아보니 ^^; 잘못 사용하면 데이터 손실이 발생할 수 있고 (persistence context), 성능에 문제 (n+1)가 생길 수 있다고 하네요. 그만큼 다루기 어려운 부분이 있어 복잡하지 않은 시스템에선 피하는 개발자들도 꽤나 있는 거겠죠?

  4. BookLoanRequest.kt에는 data class BookLoanRequest( val userName: String, val bookName: String )로 마지막 String 이후에 comma(,)를 안 찍으셨는데, BookRequest.kt에는 data class BookRequest( val name: String, val type: BookType, ) 마지막에 컴마를 찍어주셨어요. 어느게 더 바람직한 practice인가요?

  5. ExceptionUtils 파일 안에 fun <T, ID> CrudRepository<T, ID>.findByIdOrThrow(id: ID): T { 라고 T를 계속 넣어주셨는데, 그게 타입을 유연하게 받고 함수 사용을 하고자 하는 제네릭 개념인거죠?

  6. cascade = [CascadeType.ALL], orphanRemoval = true 이해하는 게 어려운 것 같아요..

  7. MutableList<UserLoanHistory> = mutableListOf() 여기서 MutableList는 가변형으로 읽기 쓰기 둘 다 되고, List는 그 반대로 읽기만 되는 거로 확인했는데 그럼 대부분 데이터 POST/UPDATE/DELETE 등에 적용되면 mutable로 가는 거네요?

아직 fundamental를 잡고 있어서 양해 부탁드려요..선생님 설명 기다리겠습니다!

답변 1

답변을 작성해보세요.

1

안녕하세요, Suyeon님~!!! 아이고~ 너무 좋죠!! 😊😊

이번에도 하나씩 답변 드려보겠습니다!!

 

[1. Controller 테스트를 작성하지 않은 이유]

이 부분은 2가지 이유가 있습니다!

  1. 저는 강의에서 말씀드린것처럼 테스트를 1개 작성해야 한다면, Controller 테스트보다는 Service 테스트를 작성하는 편입니다! 비즈니스 로직을 확인하기에 가장 적절한 계층이니까요!
    하지만 Controller 테스트를 작성해야 할 때도 있는데요, Spring MVC의 특성을 활용해 추가적인 작업을 할 때가 그렇습니다. (Cookie 핸들링을 한다거나 ArgumentResolver를 새로 단다거나...)
    이번 강의에서 다룬 서버의 경우 딱히 Controller 테스트를 중요하게 해야할 부분이 없어 생략했습니다! 아마 조금 더 난이도 높은 서버 애플리케이션을 만드는 과정에서는 들어갈 것으로 생각됩니다!

  2. 두 번째 이유는 강의 분량상의 이유입니다! 당연히 모든 개념을 한 강의에 담으면 좋겠지만, 강의가 너무 길어지면 강의 접근성이 떨어지고, 들으시는 분들 입장에서도 학습 효과가 저해되는 측면이 있더라고요!! 🥺 새로운 것이 너무 많으면 받아들이는데 한계가 있을 수 있으니까요!

 

[2. Java 파일을 남겨둔 이유]

거의 맞습니다!!! ㅎㅎㅎㅎ 정확히는 그런 목적으로 남겨두는 것을 계획했지만, 굳이 강조할 필요는 없을 것 같아서 강의 제작 과정 중간에 남게 된(?) 친구라고 생각해주시면 될 것 같습니다 ㅎㅎㅎㅎ 크으~ 매의 눈이시군요~!!! 👍👍

 

[3. JPA의 단점]

아~ JPA의 단점을 여쭤봐주셨군요!! 네네 말씀해주신 것처럼 JPA를 활용하기 위해선 트랜잭션과 영속성 컨텍스트에 대한 이해도가 필요하고, 영속성 컨텍스의 특징으로 인해 발생하는 여러 문제들 (N+1 문제를 포함해서요!) 에 대한 경험이 필요합니다!
https://www.youtube.com/watch?v=kJexMyaeHDs 이 영상을 보시면 JPA에 대한 이해도를 높이실 수 있습니다!! 👍

JPA의 단점을 한 줄로 요약해보자면, 상대적으로 깊은 이해도를 필요로 한다(=런닝 커브가 있다)라고 할 수 있겠네요!!

 

[4. trailing comma]

해당 부분은 trailing comma라고 불리는 친구입니다!

크게 상관은 없지만 trailing comma를 찍어주는 것이 조금 더 best practice라 할 수 있고, 저 역시 100% 습관화 되어 있지 않다 보니까 놓친 부분인 것 같습니다 ㅎㅎㅎㅎ 아마 코드 상 더 있을 수도 있어요..!!!

함께 협업하는 팀끼리의 convention만 잘 맞으면 되는 것 같고, 현재 제가 근무하고 있는 팀에서는 trailing comma를 찍되, 깜빡할 수도 있으니 보이면 , 추가해주자 정도로 Align을 맞추고 있습니다 ㅎㅎㅎ

 

[5. 제네릭]

네네, 맞습니다!! Generic은 Kotlin에만 존재하는 개념은 아니고, 정적 타입을 가지고 있는 대부분의 언어에 존재하는 개념입니다! 대표적으로 C++, Java 등이 있어요! 물론 언어마다 부르는 이름이나 지원되는 Generic의 범위가 조금씩은 다릅니다!

Kotlin의 Generic은 https://kotlinlang.org/docs/generics.html 에서 확인해보실 수 있습니다! 😊

 

[6. cascade와 orphanRemoval 옵션]

아이고~~ 맞습니다!! 저도 JPA를 처음 접할 때 이런 옵션들을 쓰니까 썼지 정확히 어떤 옵션이고 왜 필요한지까지는 이해하기 어려웠어요!! 해당 옵션에 대한 설명들은 다양한 블로그에도 잘 정리되어 있으니 (ex. https://kobumddaring.tistory.com/56) 습득을 위한 팁을 말씀드려 볼게요!!

가장 좋은 방법은 이 옵션을 사용했을 때와 사용하지 않았을 때 무엇이 달라지는지 비교하면서 확인해보시는거에요!! 예를 들어 cascade 옵션이 있을 때와 없을 때 대출기능이 어떻게 달라지는지, orpahnRemoval 옵션이 있을 때와 없을 때 userRepository.delete(user) 기능이 어떻게 달라지는지 등이요!!

테스트 코드를 작성해두시고 이런저런 case를 돌려보시면 점점 이해되실겁니다!! 🙏🔥

 

[7. Collection의 가변, 불변]

결론부터 말씀드리면 그럴 수도 있고, 그렇지 않을 수도 있습니다!!!

다음 코드의 예시를 볼게요~!

class Fruit(
  var name: String,
  var price: Int,
)

val fruits = listOf(Fruit("사과", 1000), Fruit("바나나", 2000))

위 코드에서 할 수 있는 것은 다음과 같습니다!

  • fruits 안에 들어 있는 원소의 이름 및 가격을 변경할 수 있다. (UPDATE)

    • 예를 들어 1000원짜리 사과를 5000원짜리로 변경할 수 있다.

하지만, 아래와 같은 행위는 할 수 없습니다!

  • fruits에 새로운 과일을 추가할 수 없다.

  • fruits에 진작 담겨 있는 과일을 제거할 수 없다.

때문에 말씀해주신 POST/UPDATE/DELETE 가 '리스트'에 원소를 더하고 빼는거라면 MutableList이어야만 가능한게 맞고, 리스트 안에 있는 원소에 대한 업데이트라면 List이어도 충분히 가능합니다!!

제 생각에는 아마 전자의 의도로 말씀해주신것 같고, 실제로도 JPA 1 : N 관계를 사용하게 되면 거의 대부분 MutableList를 사용하는 편입니다!

 

열심히 공부하시는 Suyeon님을 보며 저도 열심히 해야겠다는 생각이 드네요!!!

오늘도 행복한 하루 되세요~! 감사합니다!! 🙏 🙇 🙇

Suyeon님의 프로필

Suyeon

질문자

2023.01.05

정성껏 답변해주셔서 늘 감사해요 ^^ 화이팅입니다!