월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
테스트 코드와 트랜잭션 문의 드립니다.
강사님 영상https://www.youtube.com/watch?v=S_66BYHWT2A안녕하세요 강사님강의 잘 보고 있습니다.강의중 테스트 코드 작성하는 부분에서 궁금한 부분이 있어서요H2 데이터베이스를 사용해서하나의 테스트 파일에 여러개의 테스트 코드를 작성하게 되면auto-increment 가 같이 증가하면서 문제가 발생하더라구요관련해서 구글링을 해보니까@Transactional과 this.entityManagr .createNativeQuery("ALTER TABLE portfolio ALTER COLUMN pofo_post_no RESTART WITH 1") .executeUpdate();초기 값으로 초기화 하는 방법이 있더라구요강사님은 트랜잭션을 서비스 코드에서 사용하지 않는다고 하셨는데auto-increment 초기화를 어떻게 하시는지 궁금해서 질문 드립니다.참고 링크https://github.com/HomoEfficio/dev-tips/blob/master/Spring%20Data%20JPA%20%ED%85%8C%EC%8A%A4%ED%8A%B8%20%EC%8B%9C%20auto-increment%20%EB%AC%B8%EC%A0%9C.md감사합니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
안녕하세요! 질문드립니다!
자바 개발도 하였지만 부끄럽게도 stream 과 lambda 는 등한시 하여 잘 사용을 못했네요..후회막심하네요..다름아니라, 코틀린에서는 stream 을 잘 사용을 안하나요?stream 을 대체할 수 있는 문법이 있어서 일까요?실무에서는 stream 과 lambda 를 대부분 사용할까요?9:43 초 returnBook 을 코틀린으로 변경할때 갑자기 드는 의문이였습니다.(제가 아무것도 모르는 상태였으면 코틀린에서 stream().filter 식으로 구성하였을것같은..!!)
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
afterEach 관련 질문있습니다!
안녕하세요! 강의 잘 보고 있습니다!@AfterEach관련해서 질문이 있습니다인텔리제이에서 단축키를 사용해서 만들어주면 아래와 같이 internal 접근제한자가 붙은채로 생성이 되는데 @AfterEach internal fun tearDown() { }보통은 붙여주지 않는게 컨벤션일까요?
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
JPA 연관관계 질문입니다.
안녕하세요!강의는 다 들었는데 JPA 공부를 하다가 궁금한점이 있어서질문을 남겨봅니다.현재 User 와 UserLoanHistory 는 1:N 관계이고,User쪽에 cascade 옵션이 걸려 있는데요.그러면 User 가 삭제되면 UserLoanHistory 가 삭제될 때User 와 연관관계가 있는 히스토리의 개수만큼 delete 쿼리가 나갈거 같은데요. 뭔가 비효율적인거 같다는 생각이 들어서 찾아보니 1:N 에서 N 쪽에 @OnDelete(action = OnDeleteAction.CASCADE)옵션을 주어서 디비단에서 해결하는 방법이 있는거 같긴한데 이걸 쓰는게 맞을지 고민이 되서 질문드립니다.이 옵션은 왠지 위험해 보이는데... 그럼 cascade 옵션을 안쓰고 respository 에서 deleteAllInBatch 로 N 쪽을 지우고 1을 따로 지우는게 나을지...질문을 정리해보자면1:N 관계에서 1을 삭제시 delete 쿼리가 N개 만큼 나가서 비효율적일거 같음N쪽에 @OnDelete 옵션을 줘서 디비에 외래키 cascade delete 옵션을 주는게 나을지?수동으로 N쪽을 삭제하고 1 을 삭제하는게 나을지? 어떤쪽이 더 좋은 선택인지 고민인데 좋은 의견 주시면 감사하겠습니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
h2 테스트 환경 설정시 속도 문제
안녕하세요, 항상 친절하고 상세한 답변 감사합니다 :) 많은 도움이 되고 있습니다.덕분에 kotlin + springboot 개발을 재밌게 하고 있는데요, 예전에 답변주신데로 h2 데이터베이스로 서비스 단위 테스트를 작성하고 개발하고 있는데 매번 테스트 실행시 속도가 좀 오래걸리더라구요.실제로 테스트 실행은 1, 2초 내에 완료되는데,Instantiating tests...위 메시지와 함께 초기 테스트가 올라가는데 거의 30초 이상이 걸려서 간단한 메서드 변경 사항을 빠르게 테스트하려는데 좀 제약이 있는 상황입니다. 제가 다른 프레임워크를 쓸때는 거의 실시간으로 테스트가 동작했는데 (go 나 python) 속도를 조금 더 빠르게 할 수는 없는지 궁금합니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
BookService의 saveBook()의 @Trnasacional 궁금합니다.
BookService의 saveBook()의 @Transacional 이 붙는 이유가 궁금합니다.repository.save() 자체에도 @Transacional 이 있는데요- saveBook() 에도 붙이신 이유가 있을까요?그리고 BookEntity는 아무 연관관계도 없어서 영향이 없을것 같아서요.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
DTO 관련 질문입니다.
안녕하세요!강의를 듣다가 의문점이 생겨서 질문드립니다.컨트롤러에서 요청에 대한 응답 반환시 엔티티를 직접 반환하는 대신 DTO를 반환하는 것은 이해를 하였는데요!그렇다면 조회한 엔티티를 DTO로 변환하는 것은 서비스 계층에서도 할 수 있고 아니면 컨트롤러 계층에서도 할 수 있을 것 같은데요.강의에서는 리포지토리에서 엔티티를 직접 조회하는 경우, DTO로 조회하는 경우 둘 다 서비스 계층에서 DTO를 반환하는 식으로 구현이 되었는데요.제 생각에는 컨트롤러에서 반환하는 DTO는 아무래도 화면에 의존적이므로 UI가 바뀌면 DTO도 자주 바뀔 것 같아서서비스에서는 엔티티를 리턴하고 DTO로 변환은 컨트롤러에서 하는 방법이 좋을 것도 같긴한데요.혹시 실무에서는 어떤식으로 사용하시나용?감사합니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
질문이 있습니다!
이번 강의에서 BookQuerydslRepository 클래스 작성할 때 @Component 어노테이션을 사용하셨는데요! 기존에 스프링 사용할 때는 @Repository 어노테이션을 주로 사용하였는데 @Component를 사용하는 이유가 있을까요? 제가 알기로는 @Repository 어노테이션을 사용하면 예외 발생시 JPA예외가 스프링 예외로 변환되어 발생하는 것으로 알고있습니다.감사합니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
QueryDSL Pageable 질문
안녕하세요, 강의 잘 듣고 있습니다.동적 쿼리 구성을 하려다가 기존에findByName(name: String, pageable: Pageable)이라는 함수를 써서 쉽게 sorting 및 pagination 을 구현했는데요.영상에서처럼 검색 조건이 늘어나서 QueryDSL 로 바꾸려고 하는데, 혹시 pageable 을 쉽게 QueryDSL 에서 구현하는 방법이 있을까요?
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Kotlin/JPA Inheritance 질문
안녕하세요, Kotlin jpa 코드를 쓰다보니 레퍼런스 코드를 찾기가 쉽지 않은데요.https://ict-nroo.tistory.com/128이 블로그 글에 있는 상속 예제 코드를 코틀린으로 옮기면 어떻게 해야할까요?open class 문제나 primary constructor 로 상위 클래스를 구현하다보니 상속 부분 구현하는데서 생각보다 어려움을 겪고 있습니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Book 클래스 프로퍼티 질문입니다.
안녕하세요.이번 강의에서 코틀린 Book 클래스의 프로퍼티 name과 id를 둘 다 val로 선언하였지 않습니까?제가 알기로는 val로 선언하면 클래스 생성과 동시에 초기화되고 그 이후로는 수정이 불가능한 것으로 알고있습니다.그런데 JPA + Java에서 엔티티 클래스에 아래처럼 선언하면 JPA 리포지토리의 save 메서드를 호출 한 이후에 id필드에 값이 자동으로 들어가잖아요?@Id @GeneratedValue(strategy = IDENTITY) private Long id;그런데 코틀린 클래스에서는 id 프로퍼티 선언자체를 val로 해도 테스트가 잘 통과되는걸 봐서는 id 프로퍼티의 val, var 여부와 관계없이 리플렉션(?)을 통해 직접 필드에 접근해서 값을 넣어주기 때문인건가요?감사합니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Mocking 관련
안녕하세요, 강의에서는 'Integration' Test 를 짠걸로 보이는데요.실제 작업하실때 Mocking 해서 서비스함수 테스트를 짜시지는 않는지 궁금합니다.우리가 쓴 테스트가 'Unit' 테스트가 되려면 Mocking 을 해야할 것 같은데 혹시 Mocking 을 하는 것과 테스트 코드를 짜는 방식에 대해서 어떻게 선호하시는지 궁금합니다.
- 해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
User Entity 생성 관련 질문입니다.
안녕하세요.강의 덕분에 코틀린을 잘 배우고 있는 수강생 입니다.다름이 아니라, 예저 소스에서 User Entity로 DB에 테이블을 생성하고 있는데,제가 별도로 만든 프로젝트에서는 동일하게 User로 Entity 어노테이션을 붙이고 애플리케이션을 시작하면 에러가 발생하길래 에러 내용으로 찾아봤더니, User Entity를 user라는 이름으로 테이블을 생성하려고 하는데, user는 사용할 수 없는 이름이라는 것 같습니다(예약어)예제 소스와 동일하게 설정을 했는데 제가 놓치고 있는 부분이 있는 걸까요?
- 해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
멀티 모듈에 대한 질문이 있습니다!!
안녕하세요 !! 자바 개발자가 되기 위해 학습하다가 코틀린을 새로 배우는 과정에서 이 강의를 듣게 된 학생입니다!!먼저 좋은 강의 제공해주셔서 정말 감사합니다!!멀티 모듈에서 Repository를 각각 api 모듈에 맞게 구현하고, Spring Data JPA Repository를 코어 모듈에 둔다고 하셨는데. 이런 경우에는 api 모듈에서 core와 관련된 그래들 설정(Querydsl or db 등)이 들어가겠구나 라는 생각이 들었습니다. 멀티 모듈의 장점 중 하나가 모듈의 역할에 맞게 의존성을 관리하는 것도 있다고 생각하는데, 이런 경우 이 장점을 잃지는 않을까 우려됩니다.그래서 저는 멀티모듈을 사용할 때, core 모듈에 Repository와 관련한 코드를 놓고, 사용하는 모듈에서 인터페이스, 혹은 Repository를 참조하는 구현체를 만들어 해당 클래스만 사용하게끔 유지하는 게 좋지 않을까 생각하는 편인데요. 혹시 강사님의 의견은 어떠신지 궁금합니다!!(적고 보니 강의 내용과는 조금 다른 질문인 것 같아 조금 죄송스럽네요 ㅠㅠ)
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
UserLoanHistory.bookName의 nullability
Book.name에 @Column(nullable = false)을 붙였으니 UserLoanHistory.bookName도 논리적으로 null이 될 수 없는데요. 그래서 bookName에는 애노테이션을 붙이지 않으신 건가요? 애노테이션을 붙여서 DDL에 물리적으로 not null을 설정해야 하는 게 아닌가 싶어 질문 드립니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
테스트 컨텍스트에 대한 질문입니다.
안녕하세요. 강의를 듣던중 테스트와 관련해서 한가지 궁금한 점이 있어서 질문 남깁니다.일단 저는 현업에서 @SpringBootTest 를 사용하지 않고 서비스 계층은 목킹을 해서 별도의 스프링 컨텍스트를 사용하지 않고 테스트를 하고 있습니다. 문제는 컨트롤러 계층을 테스트 할 때인데요. @WebMvcTest 로 테스트를 할 때 하나의 컨트롤러를 테스트 할때는 상관이 없지만 통합테스트 형태로 모든 테스트를 실행시에는 @WebMvcTest 가 각각 달린 컨트롤러 테스트마다 별도의 스프링 컨텍스트가 뜨기 때문에 테스트가 느려지는데요. (모든 컨트롤러 테스트가 같은 빈 조합을 사용한다면 같은 컨텍스트를 사용하겠지만 그런 경우는 거의 없기 때문에 각각의 테스트 클래스마다 대부분 스프링 컨텍스트가 새로 뜨는거 같습니다.)그래서 하나의 추상 컨트롤러 테스트에만 @WebMvcTest 를 달고 여기에 모든 테스트 대상 컨트롤러를 다 추가하고 이 추상 클래스를 상속받아 각각의 테스트 클래스를 사용하고 있습니다. 그래서 전체 테스트 시에는 테스트 속도가 빠라졌지만, 이렇게 하다보니 하나의 컨트롤러 테스트를 할 때도 상속받은 추상클래스에 있는 모든 테스트 컨트롤러가 다 임포트 되어 하나의 컨트롤러 테스트가 너무 느려졌고, 단위 테스트의 의미가 사라지는거 같습니다. 혹시 이와 관련해서 좋은 방법이 없을까 해서 질문을 남깁니다. 그리고 @SpringBootTest 시에는 각각의 테스트 말고 전체를 테스트 할 때 @WebMvcTest 를 할 때처럼 스프링 컨텍스트가 여러개 떠서 테스트 속도가 느려지는 문제가 없을까요? 항상 @SpringBootTest 는 무겁다는 생각 때문에 잘 사용을 안해서 궁금하네요. 그리고 현업에서 @SpringBootTest 를 자주 사용하는지도 궁금합니다. 저는 주로 @WebMvcTest, @DataJpaTest 이정도를 사용하고 도메인 계층은 일반 클래스 처럼, 서비스 계층은 모킹만 해서 스프링 도움없이 테스트를 하고 있습니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
setter에 대해서 궁금점이 있습니다.
안녕하세요! 강의를 잘 듣고 있는 신입 개발자입니다 ㅎㅎㅎ..setter 사용에 대해서, 궁금한 점이 있습니다.우선, 저는 setter 사용이 왜 안좋은지에 대해서 명확한 답을 얻지 못했습니다. 심지어 Java로 개발된 여러 프레임워크나 라이브러리 등에서 많은 setAttribute와 같은 메서드가 사용되는 것을 보았기 때문입니다. 심지어 Spring 역시도요.여러 블로그에 해당 주제에 대해 찾아보면 다음과 같은 이유가 나옵니다.변경된 의도를 파악하기 어렵다.객체의 일관성을 유지하기 어렵다.어떤 class의 프로퍼티를 변경하려면 결국은 해당 클래스의 특정 메서드를 통해 변경을 해야합니다. 일반적으로 class의 변수는 private하게 선언되기 때문에요,즉 setAttribute를 쓰지않는다면,updateAttribute와 같은 별도의 메서드를 생성해서 변경해야 합니다.1. 변경된 의도를 파악하기 어렵다 의 이유라면, updateAttribute와 같은 메서드와 setAttribute와 같은 메서드의 readability의 차이가 있다는 말로 귀결되는데, 사실 저희가 setter에 대한 거부반응을 모두 지우고 두 메서드를 바라본다면 저는 차이를 느끼기 어렵습니다. 혹시 아닌가요...?2. 객체의 일관성을 유지하기 어렵다. 의 이유라면, 객체를 Immutable하게 유지하기 위함인데, 때에 따라서는 이러한 전략이 필요하지만 그렇지 않다면, 객체 값(프로퍼티)의 변경이 발생할 때 마다 새로운 인스턴스를 생성해야 한다는 말이 됩니다. 이거는... 많이 변경되어야 하는 객체라면 메모리 문제가 너무 커지지 않을까요?개인적으로 Builder와 생성자에 관한 것은 해당 문제와 연관성이 별로 없다고 생각하기 때문에, 위 두가지 이유가 결국 근거라고 생각해요. 강사님 역시 setter에 대해 사용하지 않는 것을 권고한다고 말씀하셔서, 혹시 어떤 명확한 이유인지 궁금해서 여쭤보고 싶습니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
안녕하세요 null 에 관해 질문 드리고 싶은게 있습니다.
안녕하세요 강의 잘듣고 있습니다. null 관련하여 궁금한게 있어서 질문 남깁니다. ?. 을 붙여주면 null을 다룰 수 있는 걸로 알고 있습니다. 만약 그렇다면 @notnull, @nullable 을 java 에서 사용하지 않는다는 가정하에 1. assertThat(result[0]?.age).isEqualTo(request?.age) 2. assertThat(result[0]?.age).isNull() 에서 1에 값은 NPE 가 뜨고 2에 서는 NPE 가 안뜨는 이유가 궁금 합니다. println("result[0]?.age = ${result[0]?.age}") println("result[0].age = ${result[0].age}") println("request?.age = ${request?.age}") println("request.age = ${request.age}") 위 4개의 코드에서는 전부 null 을 반환하여 질문하게 되었습니다. 읽어주셔서 감사합니다.
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
깃, 블로그 업로드 관련 질문드립니다.
안녕하세요, 선생님. 혹시 공부한 코드는 깃과 블로그에 올려도 되는지 궁금합니다!
- 미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
repository mocking 문의
안녕하세요~ 최태현님 테스트 코드 작성에 있어서 고민이 있어 문의남깁니다. 이전까지 다른 강의 영상에서는 repository를 mocking해서 서비스를 테스트하는 영상을 많이 봤습니다. 그래서 서비스 테스트시에는 repository 를 mocking 하는것이 실무에서 흔한 방식이고 best practice라고 생각했습니다 그런데 실무에서 적용해보니 mocking을 하게되면 테스트 코드가 서비스 메소드의 내부 구현에 대해 너무 잘 알게되더라구요, 그러다보니 실제 코드의 내부 구현이 바뀌면 테스트 코드도 바뀌게 될 여지가 많더라구요.. 반면 스프링부트 테스트로 h2에 연결해서 하는 테스트는 상대적으로 느려 피드백이 늦는것이 단점일것같습니다. 개인적으로는 강의에 나온것처럼 스프링 부트 테스트로 h2에 연결해서 테스트하는 후자가 더 마음에 드는데요. 실제로 현업에서는 서비스 테스트시 둘중 어떤걸로 사용하시나요? 실제 강의하신것처럼 후자로 테스트를 많이 하시나요? 좋은 강의 감사합니다~