소개
Learn, Share & Communicate 15년차 개발자 양세열입니다.
SI 환경에서 IT서비스, 사내시스템에서 핀테크까지 폭넓은 개발환경에서 다양한 비즈니스를 경험했습니다.
개발하면서 유지보수성과 확장성에 관심이 많으며, 학습과 지식전파에 많은 괌심을 갖고 있습니다.
(현) 카카오 계열사, (전) LG CNS, POSCO ICT, NTS
(교육활동) 패스트캠퍼스, 제로베이스 부트캠프 온라인 강의 및 온오프 강연 진행
강의
수강평
- 코틀린 문법부터 실무까지 (자바 to 코틀린 실무)
- 코틀린 문법부터 실무까지 (자바 to 코틀린 실무)
- 코틀린 문법부터 실무까지 (자바 to 코틀린 실무)
- 코틀린 문법부터 실무까지 (자바 to 코틀린 실무)
게시글
질문&답변
@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
- 211
질문&답변
build.gradle.kts 변경시 오류가 발생합니다.
안녕하세요. 황영롱님 질문 감사드립니다 😀 인텔리제이 2020 버전이 코틀린 1.6까지만 지원한다면 안타깝지만 이후 실습도 원활한 진행이 어렵습니다. 코틀린 1.6, 1.7, 1.8, 1.9 버전 별로 변경점이 많고 특히 코틀린 1.8 버전이 넘어가야지만 롬복에 대한 지원이 되면서 이후 실습이 가능합니다. 코틀린 2020 버전을 업데이트하시는게 가장 좋을 것 같고, 라이센스 문제가 있으시다면 얼티밋 트라이얼 버전을 30일간 사용하실 수 있으니 트라이얼을 설치하셔서 실습해보시는 것이 좋을 것 같습니다.
- 0
- 1
- 271
질문&답변
서비스, 컨트롤러 질문입니다.
안녕하세요 jheom님 😀 질문 감사드립니다~! 컨트롤러 변환 과정 중이시군요..!요 부분은 아마 제 강의에서 "실습 - controller 변환해보기"의 Controller를 코틀린으로 변환 후 테스트가 깨지는 현상을 말씀주신 것 같습니다.어노테이션의 올바른 위치를 알려드리기 위해서 의도적으로 깨지도록 되어 있었습니다. 해당 강의의 10분 42초 부분을 참고해주세요. @Valid annotion의 위치를 올바르게 수정해주시면 됩니다. 컨트롤러 변환과 서비스 쪽에서의 코드는 연관이 없기 때문에 해당 오류가 발생하면 안될 것 같습니다..^^;;혹시 다른 부분에 의도치않은 수정이 발생한 부분이 없는지 체크해봐주시면 좋을 것 같습니다. WoundedPrinceRepository가 정상적으로 bean으로 등록이 되고 있는지 체크해봐주세요.혹은 Invalidate Caches... 를 한번 수행해주시는 식으로 Cache를 날려보시면 효과가 있을 수도 있습니다. 답변드린 부분이 맞는지 체크해봐주신 후 이상이 있으면 다시 연락 부탁드립니다~!감사합니다. 좋은 밤 되세요 :)
- 0
- 2
- 213
질문&답변
실습. dto 변환해보기
안녕하세요 jheom님 😀dto 변환 중에 오류가 발생하셨군요..! 그런데 말씀하신 'Method invocation 'intValue' may produce 'NullPointerException'요 메시지는 에러가 아닌 워닝 메시지입니다. 아래처럼 해당 함수에 노란색 라인이 그어지며 마우스나 키보드 커서가 올라갔을 때 메시지가 나왔을텐데요.해당 메시지는 intValue() 앞에 있는 getExperienceYear() 라는 함수의 결괏값이 nullable하기 때문에 'NPE가 발생할수도 있다' 라고 친절한 인텔리제이가 알려주는 것입니다. 노랗게 그어졌다고 해서 에러가 실제로 발생했거나 동작하지 않는 부분은 아닙니다^^;;(사진)실제로 테스트코드는 동작하는지 다시 한번 확인 부탁드리며 혹시라도 이상이 있다면 해당 화면 캡쳐와 함께 재 문의를 부탁드립니다 🙏
- 1
- 1
- 225
질문&답변
실습. 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
- 177
질문&답변
IntelliJ IDEA 문의
안녕하세요. jheom님 사용 도구: IntelliJ IDEA Ultimate (학생 라이센스 가능) 위 내용을 보신 부분이 맞으실까요??이 부분은 학생 라이센스로도 실습이 가능하다는 의미였습니다^^;;간단히 인텔리제이 설치 가이드를 드리겠습니다.아래 링크에서 인텔리제이 다운로드가 가능합니다. https://www.jetbrains.com/ko-kr/idea/download 참고로 위 페이지에 상단부은 30일간의 평가판(얼티밋 버전)을 다운로드 받는 것이며,스크롤을 아래로 내려보시면 IntelliJ IDEA Community Edition도 받으실 수 있습니다. 제 강의에서 전반부 문법은 커뮤니티 버전으로도 충분히 실습이 가능하므로 해당 버전으로 진행을 하시면 되며, 하반부의 프로젝트 수정하는 부분은 간혹 얼티밋 버전의 기능을 활용하기 때문에 원활한 진행을 원하시면 평가판을 받으셔서 사용해보시는(30일 제한) 것도 좋은 방법일 것 같습니다!
- 1
- 1
- 152
질문&답변
PDF 안에 파일이 없습니다
안녕하세요. 김정기님 🙂추가로 제보주신 부분 확인하였습니다.확인해보니 노션에서 pdf로 변환 시 A4 사이즈로 변환하게 되면 일부 뒷 부분이 제대로 표시되지 않는 현상을 발견하였습니다. A3 사이즈로 변환하게되면 노션에서 보던 모습과 가장 유사하게 잘 표시되는 것을 확인하여 강의노트 전체를 A3 사이즈로 일관되게 변경하였습니다.제가 조금 더 꼼꼼히 봤어야만 했는데 놓친 부분인 것 같습니다^^;; 참고로 질문을 남겨주시면 김정기님 뿐 아니라 다른 분들에게도 큰 도움이 될 수 있기 때문에 죄송한 마음 가지실 필요없이 언제든지 편안하게 남겨주셔도 좋습니다. 🥰 좋은 질문과 제보 주셔서 감사드리고 행복한 주말되세요~! ✨
- 1
- 2
- 233
질문&답변
PDF 안에 파일이 없습니다
안녕하세요. 김정기님 불편하셨겠네요🥲저도 아이폰과 윈도우 10 환경에서 확인을 해봤는데, 이 두 환경에서는 이상이 없었습니다ㅠ 윈도우에서는 파일명이 다소 이상해지는 문제는 있어도 압축파일 자체에는 이상이 없었습니다. (용량이 약 6메가 정도 나오는 것으로 보입니다.)혹시 다른 환경(폰, 다른 브라우저 등)에서 테스트가 가능하시면 다시 한번 확인을 해봐주시고, 어려우시다면 이메일 주소를 남겨주시면 압축되지 않은 파일로 전송을 드리겠습니다.맛점되시고 연락 부탁드립니다 🙇♂(아래는 제가 테스트해본 이미지 캡쳐(강의노트 파일 세부 리스트) 참고로 올려드렸습니다.)(사진)(사진)
- 1
- 2
- 233
질문&답변
강의교재 PDF
안녕하세요. cu_bot님 🙂 강의노트 불편한 부분 제보주셔서 감사합니다 말씀주신 14번 강의노트와 15번 강의노트에서 복붙하는 부분이 페이지 분리가 되어 있어서 붙여넣기가 불편해보이는데요, HTML 문서로 14번 15번 강의노트를 추가해서 코드복사용으로 추가하여 올려두었습니다.또 강의 보시다 불편한 점 있으면 언제든 의견 부탁드립니다 😃감사합니다~!
- 1
- 1
- 176
질문&답변
import 질문
안녕하세요. cu_bot님 🙂 꼼꼼하게 강의를 보시고 질문주셔서 감사합니다!위에 AI 인턴이 답변을 잘 남겨놨는데 추가적으로 설명을 드리겠습니다. 일단 코틀린은 자바를 기반으로 하는 언어라고 할 수 있습니다. 그래서 기존에 자바 생태계에서 만들어두었던 수많은 라이브러리를 그대로 가져다 쓸 수 있는 점이 가장 큰 장점입니다. (아무리 좋은 언어라고 해도 이런 라이브러리가 없으면 직접 다 만들어야 해서 어려움이 크지요.) 특히 말씀주신 Duration의 경우 코틀린과 자바 두군데에서 구현을 해놓았는데요(사실 저도 코를린 Duration은 이번 기회에 봤습니다^^;), 제가 만들었던 printObject 함수의 경우 Any 타입의 obj를 타입에 따라 다른 동작을 하게 하는 것이 목적이라 코틀린 Duration이나 자바 Duration 중에 어떤 것을 사용하셔도 무방합니다. 하지만 둘이 이름은 같지만 다른 클래스이기 때문에 printObject를 호출하는 쪽에서 해당하는 Duration을 파라미터로 줘야지만 동작하게 됩니다.자바 Duration으로 파라미터가 오면 printObject가 자바 Duration 으로 구현되었을 때에만 동작코틀린 Duration으로 파라미터가 오면 printObject가 코틀린 Duration 으로 구현되었을 때에만 동작 혹은 아예 두가지 타입을 다 처리하는 함수로 바꿔줄 수도 있습니다.fun printObject(obj: Any): Unit = when (obj) { is String -> println(obj.lowercase()) is java.time.Duration -> println(obj.nano) is kotlin.time.Duration -> println(obj.inWholeSeconds) is LocalDateTime -> println(obj.month) else -> println("Unknown type") }참고로 위와 같이 이름이 같은 클래스 두개를 넣어줄 때에는 자바와 동일하게 패키지 경로를 모두 적어주어야 합니다. AI 답변에 추가로 도움이 되는 답변이었으면 좋겠습니다 😄언제든 추가 질문 있으시면 편하게 남겨주세요.감사합니다. 행복한 설 연휴 되세요 🥰
- 1
- 2
- 249