Learn, Share & Communicate 15년차 개발자 양세열입니다.
SI 환경에서 IT서비스, 사내시스템에서 핀테크까지 폭넓은 개발환경에서 다양한 비즈니스를 경험했습니다.
개발하면서 유지보수성과 확장성에 관심이 많으며, 학습과 지식전파에 많은 괌심을 갖고 있습니다.
(현) 카카오 계열사, (전) LG CNS, POSCO ICT, NTS
(교육활동) 패스트캠퍼스, 제로베이스 부트캠프 온라인 강의 및 온오프 강연 진행
강의
수강평
- 코틀린 함수형 프로그래밍 - 입문편
- 코틀린 문법부터 실무까지 (실전 자바->코틀린 변환)
- 코틀린 함수형 프로그래밍 - 입문편
- 코틀린 함수형 프로그래밍 - 입문편
- 코틀린 함수형 프로그래밍 - 입문편
게시글
질문&답변
안녕하세요 강사님, discountCache 처리 방식에 대해 질문드립니다.
안녕하세요. KoorunG님 😀 좋은 질문 감사드립니다.제시해주신 DiscountAdapter 클래스처럼 내부에서 캐시를 활용하는 전략도 충분히 가능합니다. 해당 방법은 함수형 프로그래밍을 일반적으로 활용하는 방법 중에 하나일 수 있습니다. (적은 코드로 기존 로직에 추가 기능을 제공) 하지만 DiscountAdapter와 같은 클래스는 Adapter라는 명확한 역할이 있기 때문에 단일책임원칙(SRP)을 지키도록 외부 시스템과의 통신을 통해 할인 정책을 가져오는 역할에만 충실하는 것이 좋습니다. 왜냐하면 PayService가 아닌 별도의 다른 서비스가 캐시 없이 할인 정책을 가져가게 되는 케이스가 생길 때 캐싱 처리 하지 않은 getDiscountRate 함수를 하나 더 만들거나 혹은 그때 저기에서 캐시를 제거한 후 캐시를 사용하는 클래스에서만 적용하는 등 큰 변화를 겪을 수 있기 때문입니다. 답변이 도움이 되었으면 좋겠습니다~! 더 궁금하신 사항이 있으면 언제든 편하게 질문 주세요 👍
- 1
- 1
- 14
질문&답변
[문제집] 6_함수를 응답으로 받기 - 1번문제 오류
안녕하세요. Country님! 😃소중한 문의 감사드립니다!! 말씀대로 factor라고 변수가 있어야 하는 곳에 2라는 숫자가 들어가 있었네요^^;; 수정해서 재 업로드 하였습니다. 꼼꼼하게 수강해주시고 문의까지 남겨주셔서 너무나 감사드립니다 :)새해 복 많이 받으세요~!
- 1
- 1
- 44
질문&답변
실습 자료 부분 업로드 다시 부탁드립니다!
안녕하세요, 실습 자료 관련 알려주셔서 감사합니다! 소스코드 수정 후 재 업로드 하는 과정에 실수를 해서 소스 코드가 누락되어 올라간 것 같습니다ㅠㅠ방금 올바른 파일로 교체했으니 다시 한번 다운로드 받아보시면 잘 될 것입니다. 앞으로는 더 꼼꼼히 확인하고 올리도록 하겠습니다. 제보 주셔서 다시 한번 감사드립니다.다른 궁금하신 점 있으시면 편하게 말씀해 주세요. 그럼 좋은 하루 되세요! 😄
- 1
- 1
- 41
질문&답변
@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
- 257
질문&답변
build.gradle.kts 변경시 오류가 발생합니다.
안녕하세요. 황영롱님 질문 감사드립니다 😀 인텔리제이 2020 버전이 코틀린 1.6까지만 지원한다면 안타깝지만 이후 실습도 원활한 진행이 어렵습니다. 코틀린 1.6, 1.7, 1.8, 1.9 버전 별로 변경점이 많고 특히 코틀린 1.8 버전이 넘어가야지만 롬복에 대한 지원이 되면서 이후 실습이 가능합니다. 코틀린 2020 버전을 업데이트하시는게 가장 좋을 것 같고, 라이센스 문제가 있으시다면 얼티밋 트라이얼 버전을 30일간 사용하실 수 있으니 트라이얼을 설치하셔서 실습해보시는 것이 좋을 것 같습니다.
- 0
- 1
- 317
질문&답변
서비스, 컨트롤러 질문입니다.
안녕하세요 jheom님 😀 질문 감사드립니다~! 컨트롤러 변환 과정 중이시군요..!요 부분은 아마 제 강의에서 "실습 - controller 변환해보기"의 Controller를 코틀린으로 변환 후 테스트가 깨지는 현상을 말씀주신 것 같습니다.어노테이션의 올바른 위치를 알려드리기 위해서 의도적으로 깨지도록 되어 있었습니다. 해당 강의의 10분 42초 부분을 참고해주세요. @Valid annotion의 위치를 올바르게 수정해주시면 됩니다. 컨트롤러 변환과 서비스 쪽에서의 코드는 연관이 없기 때문에 해당 오류가 발생하면 안될 것 같습니다..^^;;혹시 다른 부분에 의도치않은 수정이 발생한 부분이 없는지 체크해봐주시면 좋을 것 같습니다. WoundedPrinceRepository가 정상적으로 bean으로 등록이 되고 있는지 체크해봐주세요.혹은 Invalidate Caches... 를 한번 수행해주시는 식으로 Cache를 날려보시면 효과가 있을 수도 있습니다. 답변드린 부분이 맞는지 체크해봐주신 후 이상이 있으면 다시 연락 부탁드립니다~!감사합니다. 좋은 밤 되세요 :)
- 0
- 2
- 257
질문&답변
실습. dto 변환해보기
안녕하세요 jheom님 😀dto 변환 중에 오류가 발생하셨군요..! 그런데 말씀하신 'Method invocation 'intValue' may produce 'NullPointerException'요 메시지는 에러가 아닌 워닝 메시지입니다. 아래처럼 해당 함수에 노란색 라인이 그어지며 마우스나 키보드 커서가 올라갔을 때 메시지가 나왔을텐데요.해당 메시지는 intValue() 앞에 있는 getExperienceYear() 라는 함수의 결괏값이 nullable하기 때문에 'NPE가 발생할수도 있다' 라고 친절한 인텔리제이가 알려주는 것입니다. 노랗게 그어졌다고 해서 에러가 실제로 발생했거나 동작하지 않는 부분은 아닙니다^^;;(사진)실제로 테스트코드는 동작하는지 다시 한번 확인 부탁드리며 혹시라도 이상이 있다면 해당 화면 캡쳐와 함께 재 문의를 부탁드립니다 🙏
- 1
- 1
- 267
질문&답변
실습. 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
- 226
질문&답변
IntelliJ IDEA 문의
안녕하세요. jheom님 사용 도구: IntelliJ IDEA Ultimate (학생 라이센스 가능) 위 내용을 보신 부분이 맞으실까요??이 부분은 학생 라이센스로도 실습이 가능하다는 의미였습니다^^;;간단히 인텔리제이 설치 가이드를 드리겠습니다.아래 링크에서 인텔리제이 다운로드가 가능합니다. https://www.jetbrains.com/ko-kr/idea/download 참고로 위 페이지에 상단부은 30일간의 평가판(얼티밋 버전)을 다운로드 받는 것이며,스크롤을 아래로 내려보시면 IntelliJ IDEA Community Edition도 받으실 수 있습니다. 제 강의에서 전반부 문법은 커뮤니티 버전으로도 충분히 실습이 가능하므로 해당 버전으로 진행을 하시면 되며, 하반부의 프로젝트 수정하는 부분은 간혹 얼티밋 버전의 기능을 활용하기 때문에 원활한 진행을 원하시면 평가판을 받으셔서 사용해보시는(30일 제한) 것도 좋은 방법일 것 같습니다!
- 1
- 1
- 183
질문&답변
PDF 안에 파일이 없습니다
안녕하세요. 김정기님 🙂추가로 제보주신 부분 확인하였습니다.확인해보니 노션에서 pdf로 변환 시 A4 사이즈로 변환하게 되면 일부 뒷 부분이 제대로 표시되지 않는 현상을 발견하였습니다. A3 사이즈로 변환하게되면 노션에서 보던 모습과 가장 유사하게 잘 표시되는 것을 확인하여 강의노트 전체를 A3 사이즈로 일관되게 변경하였습니다.제가 조금 더 꼼꼼히 봤어야만 했는데 놓친 부분인 것 같습니다^^;; 참고로 질문을 남겨주시면 김정기님 뿐 아니라 다른 분들에게도 큰 도움이 될 수 있기 때문에 죄송한 마음 가지실 필요없이 언제든지 편안하게 남겨주셔도 좋습니다. 🥰 좋은 질문과 제보 주셔서 감사드리고 행복한 주말되세요~! ✨
- 1
- 2
- 283