안녕하세요 😊
제가 아는 내용을 이해하기 쉽고, 재미있게 설명드려 여러분들이 성장하실 때 행복함을 느끼는 개발자 최태현입니다.
(현) 캐치테이블[와드] 소프트웨어 엔지니어
(전) 스타트업 소프트웨어 엔지니어 리드
(전) 배달의민족[우아한형제들] 소프트웨어 엔지니어
(교육활동) Next Step 리뷰어 다수 참여, 공기관 & 스타트업 경진대회 강사 및 멘토, 스파르타 코딩클럽 멘토
한국과학기술원 (KAIST) 졸업
Khóa học
Đánh giá khóa học
- Coroutine trong 2 giờ
- Hướng dẫn dành cho người mới bắt đầu sử dụng Java và Kotlin
- Hướng dẫn dành cho người mới bắt đầu sử dụng Java và Kotlin
- Kotlin nâng cao
yjhk00018179
·
Trong thực tế! Phát triển ứng dụng quản lý thư viện với Kotlin và Spring Boot (tái cấu trúc dự án Java)Trong thực tế! Phát triển ứng dụng quản lý thư viện với Kotlin và Spring Boot (tái cấu trúc dự án Java)
Bài viết
Hỏi & Đáp
45강 빌드 오류입니다.
안녕하세요 정아님! 🙂 질문 주셔서 감사합니다.AI 인턴이 언급해준 것처럼Cannot find a Java installation on your machine (Linux 6.1.134-152.225.amzn2023.x86_64 amd64) matching: {languageVersion=17, vendor=any vendor, implementation=vendor-specific, nativeImageCapable=false}. Toolchain download repositories have not been configured.이 핵심으로 보이는데, Java 17의 설치가 제대로 감지되지 않은 것 같아요! Java 설치까지는 하셨다면 https://inpa.tistory.com/entry/IntelliJ-%F0%9F%92%BD-%EC%9E%90%EB%B0%94-JDK-%EB%B2%84%EC%A0%84-%EB%B3%80%EA%B2%BD-%EB%B0%A9%EB%B2%95와 같은 글을 참고해서 IntelliJ 설정을 추가로 해보시면 좋을 것 같습니다. FE 코드는 메일로 보내드렸습니다. 감사합니다. 🙇
- 0
- 2
- 35
Hỏi & Đáp
active profiles는 인텔리제이 커뮤니티 버전에 없네요
안녕하세요 은성님~ 🙂 공유해주셔서 감사합니다. 🙏
- 0
- 2
- 21
Hỏi & Đáp
범위 비교 질문
안녕하세요! Jordy JH Ho님! 🙂 좋은 질문 올려주셔서 감사합니다.답글 남겨주신 것처럼 in 자체는 contains 함수를 사용하게 되어 있고, Range 는 contains 함수를 override 하고 있어 꽤나 효율적으로 구현되어 있습니다.생각보다 Kotlin이 이런 부분을 잘 구성해 두었더라고요! 신혼여행을 다녀오느라 이제서야 확인했네요 🥲 또 궁금하신 점 있으시면 편하게 질문 남겨주세요!감사합니다. 🙇
- 1
- 2
- 26
Hỏi & Đáp
다른 예외 처리 방식
안녕하세요 용찬님! 🙂 넵넵 말씀해주신 방법도 좋다고 생각해요!! 👍오히려 굳이 select SQL을 날리지 않고 update SQL만 한 번 보내면 되니 조금 더 좋네요!제가 강의에서 조회 후 업데이트로 보여드린 이유는 다음 단계에서 Spring Data JPA로 바꿀 때 Entity 조회 + 제거를 그대로 보여드리기 위함이었습니다!강의를 토대로 더 발전해주셔서 감사합니다! 🙏
- 0
- 2
- 24
Hỏi & Đáp
이 질문이 왜 없는지 이해가 안 되지만 문제 인식 및 해결 방법 남깁니다.
안녕하세요! lsj59285님! 🙂 좋은 공유해주셔서 감사합니다.몇 가지 자료를 더 살펴보느라 답변이 살짝 늦었는데요..! 제가 사용한 환경에서는 Kotlin Entity에 type 이라는 이름을 가진 필드가 있어도 (Enum이라 한다면..) 아래와 같은 QClass 내부의 type 필드가 잘 생겼습니다. 즉, type 이라는 이름만 사용해도 QClass를 통해 불러올 수 있습니다.public final EnumPath type = createEnum("type", XXXType.class);관련해서 검색도 해보고 제가 작업중인 여러 프로젝트도 확인해보았으나, type 이라는 필드를 그대로 사용하는데는 크게 어려움이 없었습니다.혹시나 버전이나 환경에 따라 달라질 수도 있으니 참고만 해주시면 감사드리겠습니다. 🙇
- 1
- 2
- 45
Hỏi & Đáp
inteliJ 대신 VScode 설치해도 될까요?
안녕하세요 혜빈님! 🙂 네네 VScode로 진행하셔도 괜찮습니다.다만 강의가 IntelliJ로 진행되는 만큼 다른 부분은 vs code 에서 찾아 진행하셔야 할 수도 있어요! 감사합니다. 🙇
- 0
- 2
- 80
Hỏi & Đáp
Coroutine과 ThreadLocal관련 질문
안녕하세요! 대영님~ 좋은 질문 감사드립니다. ☺먼저, 말씀해주신 문제는 충분히 생길 수 있는 문제입니다. 때문에 코루틴에서 ThreadLocal을 그냥 사용하는 것은 코드가 의도한대로 동작하지 않을 수 있어요! (1) 그런 관점에서 안티패턴 혹은 의도와 다른 동작 이라고 볼 수 있을 것 같습니다. (2) 또한 코루틴을 사용할 때 ThreadLocal을 직접적으로 사용하는 경우는 많이 없습니다. 하지만 간혹 프레임워크에서 ThreadLocal로 관리되는 변수에는 접근해야 할 일이 있는데, (서버 개발자 이신 경우...) Slf4j MDC가 대표적인 것 같습니다.로깅에서 특정한 traceId를 활용하기 위해 Filter 같은 곳에서 MDC.set("traceId", 일정한 난수) 를 수행했다고 해보죠! 그리고 나서 코루틴에 들어가 로직이 실행되는데, 이 안에서 로그를 찍으면 traceId 가 함께 나와야 하는거에요!MDC는 내부적으로 ThreadLocal을 사용해 traceId와 같이 입력된 필드를 저장하기 때문에 말씀해주신 흐름에 따라 코루틴에서는 로그가 제대로 추적되지 않을 수 있습니다. 이런 경우 CoroutineContext를 이용하실 수 있는데요~ 스레드가 변경되더라도 일련의 실행 흐름을 추적할 수 있는 context를 구성하는 방식입니다. 코루틴은 MDC에 대해서 라이브러리 형태로 제공하고 있기에 아래 의존성을 추가하신 후implementation("org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.9.0")runBlocking(MDCContext()) 처럼 코루틴 세계에 진입하는 지점에 MDCContext() 를 적어주기만 하면 ThreadLocal로 관리되고 있던 변수들을 CoroutineContext로 옮겨와 관리할 수 있도록 됩니다. 🙂(이 기능의 내부 원리가 CoroutineContext의 Element를 관리하는 것 이고요..! ThreadContextElement를 찾아보셔도 좋습니다!) 참고로, 이런 방식은 spring webflux도 필요합니다. 답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇
- 0
- 2
- 58
Hỏi & Đáp
테스트를 위한 코드
안녕하세요! 71kimty님~ 🙂 정말 좋은 질문이십니다. AI 인턴이 얘기해 준 것 처럼, fixture 함수를 Entity 클래스 안에 (더 정확히는 production 코드 안에) 넣게 되면 장단점이 있다고 생각해요.장점은 멀티 모듈에서 하위 모듈 (보통 하위 모둘에 Entity가 들어가죠) 의 fixture를 상위 모듈에서 쉽게 접근할 수 있다 는 것이고단점은, 어쨌거나 프로덕션 코드에서 fixture에 접근 가능하다는 것이죠.(만약 test 코드 안에 fixture를 작성하면 상위 모듈에서 하위 모듈의 fixture를 사용할 수 없게 되어 상당히 불편합니다 🥲)저는 마치 kotlin의 public var 필드처럼 열어두지만 사용하지 않는 것을 convention으로 하는 편이고, 요즘은 Entity companion object에 fixture를 바로 넣지 않고 같은 패키지에 object UserFixtures 와 같은 싱글톤을 만들어 테스트 함수를 넣는 편입니다. 만약, 위에서 말씀드린 단점을 극복하면서도 장점을 누리고 싶다면, https://tech.kakaopay.com/post/given-test-code-2/를 참고해보셔도 좋습니다.java-test-fixtures 와 같은 라이브러리를 사용하면 프로덕션 폴더도 아니고 테스트 폴더도 아닌 제 3의 구조를 만들어 의존성 설정이 되어 있는 모듈에서 쓸 수 있게끔 처리할 수 있습니다. 개인적으로도 좋은 방법이라 생각합니다. 🙂 답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇
- 1
- 2
- 49
Hỏi & Đáp
30강 질문
안녕하세요! 🙂 성장하자님~ 항상 디테일한 부분까지 질문 주셔서 감사합니다. repository를 user를 다룰때는 repository라는 패키지를 따로 만들어서 했는데, 지금 강의의 book에 관한 repositorty를 따로 만들지 않고 인터페이스만 객체와 같은 패키지에 만들어서 extends로 jpa를 받기 때문에 따로 만들 필요가 없어서 이렇게 만든거라고 이해 했는데 맞게 이해한걸까요? 제가 질문을 정확히 이해한 것인지 모르겠지만JpaRepository를 extends하는 interface를 만들 때는 패키지를 repository 로 분리하지 않고,JdbcTemplate을 사용하는 Repository를 만들 때는 repository 패키지를 왜 분리했는가가 질문인 것 처럼 느껴집니다! 결론부터 말씀드리면... 개인 취향에 가깝습니다. 🙂어떤 분들은JpaRepository 이건 SQL을 직접 사용하는 Repository 이건 repository패키지로 분리하는 것을 선호하시고요!어떤 분들은@Entity 와 같은 패키지에 JpaRepository 및 관련 Repository (ex. Querydsl) 을 함께 넣으시는 것을 선호하시기도 합니다. 저는 개인적으로 후자의 취향을 갖고 있고, 프로젝트 내 일관성만 유지되면 어떤 방식이건 크게 다르지 않다 라고 생각하고 있습니다. 감사합니다. 🙏
- 0
- 1
- 62
Hỏi & Đáp
20강 인터페이스
안녕하세요! ☺ 인터페이스에서 @Override 어노테이션을 붙이지 않은 것에 대해 문의 주신 것 같아요~ (타임라인 - 13:54)강의 상에서 코드 변경과 스프링 컨테이너의 의의를 설명드리기 위해 슈도 코드를 작성한 것으로 봐주시면 될 것 같습니다. 물론 자바에서는 코틀린과 달리 @Override 를 필수로 작성 하지 않아도 오버라이드 된 것으로 간주되긴 하지만 명확한 가독성을 위해 어노테이션을 작성해주시는게 좋습니다.감사합니다 🙇
- 0
- 2
- 52