소개
Learn, Share & Communicate 15년차 개발자 양세열입니다.
SI 환경에서 IT서비스, 사내시스템에서 핀테크까지 폭넓은 개발환경에서 다양한 비즈니스를 경험했습니다.
개발하면서 유지보수성과 확장성에 관심이 많으며, 학습과 지식전파에 많은 괌심을 갖고 있습니다.
(현) 카카오 계열사, (전) LG CNS, POSCO ICT, NTS
(교육활동) 패스트캠퍼스, 제로베이스 부트캠프 온라인 강의 및 온오프 강연 진행
강의
전체 1수강평
- 좋은 강의 감사합니다.
문석청
2024.02.21
2
게시글
질문&답변
2024.05.07
@RelaxedMockK로 모킹하고 save 함수를 왜 또 모킹하는지 모르겠습니다.
안녕하세요. 최진호님! 좋은 질문 감사드립니다.(우선 제 강의를 듣고 실무에 적용해보려 하신다니 강의의 목적을 이룬 것 같아 뿌듯합니다😄 ) 일단 말씀주신 부분의 강의를 제가 다시 주의깊게 들어보니 빠르게 진행되면서 설명이 부족한 부분이 있었네요ㅠㅠ @RelaxedMockK로 모킹을 하는 것은 중요한 기능을 모킹하고 덜 중요하고 반복적인 부분에서의 모킹은 덜 하기 위함입니다. 그래서 완화된(Relaxed) 모킹을 사용하는 경우 기본적인 타입(Int, Long, String 등)과 널러블한 응답을 하는 함수들은 각 타입의 기본 값인 0, "", null 등을 반환합니다. 하지만 RelaxedMockK 모킹이 잘 안되는 케이스가 있는데 바로 Generic Type입니다. 이 경우에는 해당 타입을 정확히 알 수 없어서 기본값을 찾지 못하고 완화된 모킹이 설정되지 않기 때문에 직접 모킹을 진행해줘야 합니다. MockK 문서의 해당항목에서도 "Note: relaxed mocking is working badly with generic return types. A class cast exception is usually thrown in this case. Opt for stubbing manually in the case of a generic return type." 라고 언급을 하고 있습니다. 그리고 JpaRepository의 Inteface를 살펴보시면 아래와 같이 save 메서드가 S라는 Generic Type을 사용하고(파라미터와 응답 값으로) 있는 것을 알 수 있습니다. 따라서 이 함수의 동작은 완화된 모킹으로 동작하지 않아서 직접 모킹을 수행해줘야 했습니다. public interface CrudRepository extends Repository { S save(S entity);관련 MockK github issue도 있으니 참고해보세요 😀 : https://github.com/mockk/mockk/issues/321 또, JpaRepository로 save를 수행하면 결과로 영속화가 완료된 Entity를 응답하게 되는데 테스트하는 코드에서는 save의 응답 값을 따로 사용하지 않습니다. 따라서 응답하는 값은 어떤 값이 나와도 무방하고 그냥 Prince Entity 타입이기만 하면 되는 상황이었습니다^^;; 그래서 랜덤한 값으로 빠르게 생성하는 작업을 보여드리려고 Fill Class도 소개하면서 겸사겸사 설명드리다보니 생략이 많이 된 것 같습니다. 설명에서 놓친 부분에 대한 좋은 질문 주셔서 감사드립니다. 🙇♂실무에서 재미있게 활용해보세요~^^ (참고로 올해 하반기에 '코틀린 함수형 프로그래밍 입문(가칭)'도 출시 예정입니다. 많은 기대 부탁드려요~!)
- 1
- 1
- 193
질문&답변
2024.04.04
build.gradle.kts 변경시 오류가 발생합니다.
안녕하세요. 황영롱님 질문 감사드립니다 😀 인텔리제이 2020 버전이 코틀린 1.6까지만 지원한다면 안타깝지만 이후 실습도 원활한 진행이 어렵습니다. 코틀린 1.6, 1.7, 1.8, 1.9 버전 별로 변경점이 많고 특히 코틀린 1.8 버전이 넘어가야지만 롬복에 대한 지원이 되면서 이후 실습이 가능합니다. 코틀린 2020 버전을 업데이트하시는게 가장 좋을 것 같고, 라이센스 문제가 있으시다면 얼티밋 트라이얼 버전을 30일간 사용하실 수 있으니 트라이얼을 설치하셔서 실습해보시는 것이 좋을 것 같습니다.
- 0
- 1
- 254
질문&답변
2024.04.03
서비스, 컨트롤러 질문입니다.
안녕하세요 jheom님 😀 질문 감사드립니다~! 컨트롤러 변환 과정 중이시군요..!요 부분은 아마 제 강의에서 "실습 - controller 변환해보기"의 Controller를 코틀린으로 변환 후 테스트가 깨지는 현상을 말씀주신 것 같습니다.어노테이션의 올바른 위치를 알려드리기 위해서 의도적으로 깨지도록 되어 있었습니다. 해당 강의의 10분 42초 부분을 참고해주세요. @Valid annotion의 위치를 올바르게 수정해주시면 됩니다. 컨트롤러 변환과 서비스 쪽에서의 코드는 연관이 없기 때문에 해당 오류가 발생하면 안될 것 같습니다..^^;;혹시 다른 부분에 의도치않은 수정이 발생한 부분이 없는지 체크해봐주시면 좋을 것 같습니다. WoundedPrinceRepository가 정상적으로 bean으로 등록이 되고 있는지 체크해봐주세요.혹은 Invalidate Caches... 를 한번 수행해주시는 식으로 Cache를 날려보시면 효과가 있을 수도 있습니다. 답변드린 부분이 맞는지 체크해봐주신 후 이상이 있으면 다시 연락 부탁드립니다~!감사합니다. 좋은 밤 되세요 :)
- 0
- 2
- 208
질문&답변
2024.03.30
실습. dto 변환해보기
안녕하세요 jheom님 😀dto 변환 중에 오류가 발생하셨군요..! 그런데 말씀하신 'Method invocation 'intValue' may produce 'NullPointerException'요 메시지는 에러가 아닌 워닝 메시지입니다. 아래처럼 해당 함수에 노란색 라인이 그어지며 마우스나 키보드 커서가 올라갔을 때 메시지가 나왔을텐데요.해당 메시지는 intValue() 앞에 있는 getExperienceYear() 라는 함수의 결괏값이 nullable하기 때문에 'NPE가 발생할수도 있다' 라고 친절한 인텔리제이가 알려주는 것입니다. 노랗게 그어졌다고 해서 에러가 실제로 발생했거나 동작하지 않는 부분은 아닙니다^^;;(사진)실제로 테스트코드는 동작하는지 다시 한번 확인 부탁드리며 혹시라도 이상이 있다면 해당 화면 캡쳐와 함께 재 문의를 부탁드립니다 🙏
- 1
- 1
- 216
질문&답변
2024.03.25
실습. gradle update/script 강의 문의
안녕하세요 jheom님 😊맞습니다! 꼭 실습을 해보셔야만 정확한 학습이 가능합니다. 질문주셔서 너무 감사드립니다👍 지금 전체적인 gradle kts파일 내용을 다 주시진 않으셔서 완전하게 파악이 쉽진 않습니다만,오류 내용은 id 라는 키워드를 인식하지 못했다는 의미입니다. id("org.springframework.boot") version springBootVersion id("io.spring.dependency-management") version "1.1.4"일단 오류가 발생한 이 라인이 한 라인에 id라는 부분이 두번 들어가 있어서 문제가 생겼을 수 있을 것 같은데 아래처럼 두 라인으로 분리해서 실행해보시겠어요?id("org.springframework.boot") version springBootVersionid("io.spring.dependency-management") version "1.1.4"참고로 해당 라인은 플러그인의 리스트를 입력하는 부분이며id("{플러그인 이름}") version {버전} 과 같은 양식으로 입력이 되어야 합니다.저도 보여주신 것처럼 id 로 시작하는 두줄을 한줄로 합쳐서 테스트를 해보니 동일한 오류가 발생합니다.한번 이렇게 수정해서 테스트 해보시고 그래도 이상 있으시면 kts 파일 전체 내용을 올려주시면 더 정확하게 확인해보겠습니다.🙏
- 1
- 2
- 165