안녕하세요 😊
제가 아는 내용을 이해하기 쉽고, 재미있게 설명드려 여러분들이 성장하실 때 행복함을 느끼는 개발자 최태현입니다.
(현) 캐치테이블[와드] 소프트웨어 엔지니어
(전) 스타트업 소프트웨어 엔지니어 리드
(전) 배달의민족[우아한형제들] 소프트웨어 엔지니어
(교육활동) Next Step 리뷰어 다수 참여, 공기관 & 스타트업 경진대회 강사 및 멘토, 스파르타 코딩클럽 멘토
한국과학기술원 (KAIST) 졸업
講義
受講レビュー
- Java開発者向けのコトリン入門(Java to Kotlin Starter Guide)
- Java開発者向けのコトリン入門(Java to Kotlin Starter Guide)
投稿
Q&A
aws 배포할때 .env 파일에 저장한 환경변수에 관하여 여쭤볼게 있습니다
안녕하세요 커디널스님! 🙂 좋은 질문 감사합니다.우선 보안과 관련해 바람직한 접근은 아니지만 github private repo + yml 혹은 .env 에 민감 정보를 관리하는 방안이 있습니다. 규모가 꽤 큰 회사에서도 본격적인 보안 감사를 준비하기 전에는 종종 사용하는 방법이고요~ (side project 에서도 추천 하는 방법입니다)이보다 좋은 Best Practices는 AWS SecretsManager 같은 민감 정보 저장소를 사용하거나 hashicorp vault 같은 민감 정보 저장소를 직접 운영하는 방법이 있습니다. 작은 프로젝트에서는 AWS SecretsManager 가 조금 더 편리했던 경험이 있습니다. (실무에서 조금 더 추천 하는 방법입니다)답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇
- 0
- 1
- 17
Q&A
마이그레이션 오류입니다.
안녕하세요! 아하~ 최신 버전은 3.5.6을 해보려고 하셨군요! ☺저도 항상 버전업을 할 때마다 버전을 올리고 오류를 자세히 읽어보며 하나씩 설정을 변경해 나가는 편이라 100% 정답을 말씀드리기는 어렵네요 🥺 다만 보내주신 에러 내용만 봤을 때는캐시 파일을 삭제 하려고 해도 디렉터리가 비어있지 않다는 오류가 뜨며 삭제되지 않음이 저도 유력한 듯 해서프로젝트 최상단에서 rm -rf .gradle 이라고 해보셔도 좋을 것 같아요! 이 명령어는 gradle 숨김 폴더에 있는 캐시를 모두 지우는 명령어 입니다.답변이 도움이 되었으면 좋겠습니다. 🥲 감사합니다 🙇
- 0
- 3
- 37
Q&A
Whitelabel Error Page 오류가 났습니다.
안녕하세요!! 🙂 seongmin2053님~ 혹시 현재 application.yml 설정이 어떻게 되어 있는지, 어떤 경로로 h2-console로 접근하려 했는지 확인 가능하실까요?!사용하신 설정을 기반으로 어떤 부분이 문제인지 추적해 볼 수 있을 것 같습니다. 🙇
- 0
- 2
- 31
Q&A
안녕하십니까! 오류가 났습니다.. 도와주세요 ㅜㅜ
안녕하세요~ 해결되셨다니 다행이네요!! ☺이럴 때는 각 단계별로 로그를 찍어 어떤 단계에서 이상이 생겼는지 확인해보거나 디버거를 사용해 보셔도 좋습니다!감사합니다~~ 🙇
- 1
- 3
- 30
Q&A
2강 예제 소스 실행 문의
안녕하세요! 🙂 보내주신 내용을 확인해 보았는데요!실행 환경 차이 (ex. IntelliJ로 실행하게 되어 있는데 Java 9 미만으로 실행되고 있는 경우) 또는오탈자가 유력해 보입니다! 제가 질문자 분의 환경을 100% 확인할 수는 없어서 github 으로 테스트 해보신 내용을 보내주시면 직접 확인해보도록 하겠습니다! 감사합니다. 🙇
- 0
- 2
- 29
Q&A
궁금한게 있습니다.
안녕하세요!! 🙂 질문 주셔서 감사합니다~1 : N 이란 표현은 이해해주셨는데요~~ 이렇게 생각하시면 되어요!A 데이터가 B 데이터 N개와 연결될 수 이으면 1 : N 관계이다.즉, 한 유저는 대출 기록 여러개를 가질 수 있죠반대로 한 유저는 주민등록번호를 반드시 1개만 가질 수 있으므로 1 : 1 관계라고 할 수 있을거에요! 자 다음으로 그게 어떻게 User 객체와 user_id bigint 컬럼과 매핑이 되는지 잘 모르겠습니다라고 해주셨는데요!JPA를 사용하게 되며@Entity가 붙은User 클래스는 테이블과 매핑이 됩니다.객체에서는 long id 로 표현된 데이터가 실제 데이터베이스에는 bigint id 로 저장되는 것이죠여기까지 이해가 되셨다면, 이제 1번 유저가 있다고 생각해 보겠습니다.User 클래스의 id 필드에는 1이 들어 있고, user 데이터베이스 id 필드에도 1이 들어 있습니다. 이 유저가 100번 책과 110번 책 2권을 빌렸다면 대출 기록은 이렇게 생겼을거에요!단순화한 대출 기록 스키마 = (user_id, 책 id)(1, 100) -> 1번 유저가 100번 책을 빌렸다(1, 105) -> 1번 유저가 105번 책을 빌렸다이렇게 되면 유저 테이블에는 데이터가 1줄 들어 있겠고, 대출 기록 테이블에는 데이터가 2줄 들어있겠네요~ ☺ 많은 개념이 동시에 들어오며 1:N 이라는 워딩, 그것이 데이터베이스에서 표현되는 방법론에 대해서 질문 주신 것 같아요! 답변의 흐름을 따라 하나씩 이해해보고, 직접 실행하며 데이터를 확인해보시면 이해가 더욱 잘 되실거에요!답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇
- 0
- 2
- 21
Q&A
DTO 관련
안녕하세요! eovnfjfpa님~ 🙂 크~ 많이 물어보시는 질문인데요!살짝 복잡한 내용일 수 있지만, 스프링은 들어오는 문자열 (HTTP Body에 들어 있는 json 이죠!) 을 객체로 변환하는 과정에서 객체의 생성자를 필요로 합니다!그리고 어떤 생성자가 필요한지는 스프링 버전에 따라, 객체 필드 수에 따라 조금씩 다르더라고요... 😅때문에 개인적으로는 기본 생성자 (= 아무것도 받지 않는 생성자) 를 항상 넣어주는 편입니다. lombok을 사용할 경우 @NoArgsConstructor 를 항상 붙이는 것이죠~ 자바 17이 넘어가게 되면서는 record class가 등장해 record 클래스를 사용하면 조금 더 쉽게 대응이 되는 편입니다. 또 궁금한 점 생기시면 언제든 편하게 질문 주세요~ 감사합니다.
- 0
- 2
- 28
Q&A
궁금한게 있습니다!
안녕하세요~ eovnfjfpa님~ 🙂 현업을 기준으로 말씀드리면, "이 정도는" 미리미리 분리해서 구현하는 편입니다!제가 "이 정도는" 이라고 강조한 이유는 Layered Architecture 혹은 어떠한 디자인 패턴에 대한 이해는 보통 실무자 간의 이해도가 모두 존재하기 때문에 시작부터 각 클래스에 대한 역할을 적절히 정의하고 코드를 작성할 수 있기 때문입니다.반대로, 낯선 패턴을 적용해야 하거나, 코드를 작성 하다 보니 코드가 길어져 유지 보수성이 떨어지는 경우는 "리팩토링"을 통해 코드를 재배치 하곤 합니다. (이런 경우는 꽤 자주 일어납니다!)답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇
- 0
- 2
- 24
Q&A
35강에서 returnBook 에서 userLoanHistory 값 중복에 관하여
안녕하세요!! ☺ 커디널스님! 정말 좋은 질문이시네요~ 항상 이와 비슷한 질문이 들어올 때마다 훌륭한 수강생을 만난 것 같아 기분이 좋습니다.AI 인턴이 답변해준 것처럼 아래 글을 함께 보시면 더 좋습니다.- 35강 책 대출 반납 기능 리팩토링과 지연로딩 적용 후의 문제 결론부터 말씀드리면, 한 사람이 이미 같은 책을 빌렸고 반납한 기록이 있다면 중복으로 잡힙니다.는 위 로직에서 고려되지 않은 로직입니다.이와 비슷하게한 책이 2권 이상 존재하는 경우도고려되어 있지 않습니다. 어떠한 로직을 볼 때 어떤 요구사항까지 반영되어 있고, 어떤 요구사항이 반영되어 있지 않은지를 확인하는 것은 매우매우 좋은 습관이라고 생각합니다. 동시에 반영되지 않은 요구사항을 구현할 때는 어떤 변경이 어느 정도의 비용 (= 소요 시간) 으로 필요할까 생각해보는 것도 좋습니다. ☺예를 들어, 말씀해주신 것 한 사람이 과거에 빌린 책을 다시 빌린 후 반납한다면, returnBook 에서 단순히 책의 이름으로 특정 Book 객체를 찾는 것이 아닌, 책의 이름과 상태를 함께 고려하도록 변경되어야 하고 이는 5분 내외의 짧은 비용이 들겠네요~ 답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇
- 0
- 2
- 27
Q&A
질문있습니다!
안녕하세요!! eovnfjfpa님~ 오~~ 좋은 질문입니다!! ☺제 생각에는 정말 비슷하면서도 약간 다른 것 같아요!API : 프로그램 간 정해진 약속을 해서 정해진 기능을 수행하는 것프로토콜 : 시스템 (혹은 프로그램 보다 더 큰 단위) 에서 어떠한 규칙을 정해 그 규칙을 각자가 수행하는 것과 같은 느낌인데요... 프로토콜이 훨씬 더 큰 영역에 적용되는 규칙/규약 이라고 봐주시면 될 것 같습니다. 약간.. 프로토콜은 도로교통법, API는 버스 정류장 노선 같은 느낌이랄까요~~답변이 도움이 되었으면 좋겠습니다. 감사합니다! 🙇
- 1
- 1
- 23