요약 Optional findById(ID id) : 탐색하다. 탐색 결과가 없을 수 있음. 내부 예외 발생 없음. T getOne(ID id) : 가져오다. 가져오려는 대상이 없을 시, 내부에서 예외 발생. (EntityNotFoundException) getOne은 Deprecated 되었고 대신 getReferenceById 가 권장됨. getReferenceById는 EntityManager#getReference 를 사용하며, 조회된 entity 내부값 접근 전까지 lazy loading처리함. ✨ find vs get 리뷰어의 학습링크 Repository 내 구현되는 메서드 명으로 find 와 get 을 선택함에는 다소 신중함이 필요합니다. 메서드명으로 find를 쓰느냐, get을 쓰느냐에 따..
🧑⚖️ 체스 게임방 삭제 관련 기능은 도메인 규칙이다 우아한테크코스 레벨 2 첫 미션, 스프링 체스 2단계에서 도메인 요구사항이 추가되었습니다. 여러 게임을 게임 방으로 관리하되, 게임 종료 상태이고 비밀번호가 일치할 경우 삭제할 수 있다는 것이었습니다. 첫 고민은 이 요구사항과 관련된 도메인 객체를 만들어야 하느냐 였습니다. 이 규칙은 실제 체스 규칙과는 상관이 없지만, 해결하고자 하는 주요 문제 영역이자 관심사라고 판단했습니다. 또한 프리젠테이션 레이어나 인프라스트럭처 레이어가 변경되더라도, 게임방 관리, 비밀번호 확인 등의 도메인 규칙이 변경되지 않는다면 동일하게 사용되어야 한다고 판단했습니다. 그래서 도메인 객체 Room 추가했습니다. 📨 Room 에게 메시지를 보내기 위한 준비 사실도메인 객..
🎆 생존을 위한 취미 개발 이외에도 마음 쏟을 무언가, 즐거움이 되는 무언가가 꼭 필요한 것 같습니다. 그리고 아마 이것은 개발이 아닌 다른 일을 업으로 삼더라도 그러할 것입니다. 성과가 당장 없음에도 계속해서 노력을 투입해야 하는 시기가 있기 때문입니다. 눈에 보이지 않아도 계속해서 노력을 부어야 하는 그 때, 주의를 환기시킬 무언가가 있다면, 노력해서 성취감을 느낄 수 있는 또다른 원천이 있다면, 본업에서 만날 슬럼프를 조금 더 초연하게 대처할 수 있지 않을까요? 저는 우테코 레벨1에서 큰 슬럼프를 만났습니다. 그래서 나름의 발버둥으로 취미를 붙들었습니다. 처음으로 커피도 배워보고, 놓았던 기타도 다시 잡았습니다. ☕ 처음 만난 커피 4주간 매주 1번씩 카페에 방문해 수업을 들었습니다. 꽤나 재미가 ..
전체 코드 보러 가기 ❌ Don't try this at home 호기심에 실험적으로 도전한 내용입니다. 오직 목적한 바에만 몰입하여 구현에만 집중했습니다. 코드 품질은 무시했으니 재미로 봐주시면 감사하겠습니다. ✍️ 제작 동기 레벨2 지하철 노선도 미션에서 Line, Station, Section 이라는 세 도메인을 만났습니다. 각 도메인 별 Dao가 만들어지고 유사한 CRUD로직이 나타나고 있었습니다. 이들을 하나의 CRUD로 추상화해서 중복을 제거해보고 싶었습니다. JPA를 아주 살짝 사용해본 경험과, 미션의 예시 코드에서 ReflectionUtils를 사용한 내용이 힌트가 되었습니다. Jackson 라이브러리가 JSON 객체를 직렬화, 역직렬화 하는 과정에서 기본 생성자로 인스턴스를 생성한 뒤, ..
Component, Repository, Service 애너테이션 중 무엇을 사용하더라도 Spring Bean에 등록되는 건 동일합니다. 그럼 어떤 차이가 있고, 둘을 구분해서 사용하는 기준은 무엇일까요? 1. 🔎 Component Scan 스프링은 설정된 범위를 탐지해 Spring Bean으로 생성해 Application Context에 보관합니다. 모든 클래스를 Spring Bean으로 생성해두는 것은 아니고, 그러하도록 선언된 클래스들을 생성합니다. Spring Bean으로 생성하도록 선언하는 방법은 크게 세 가지가 있습니다. XML 선언 방법은 이젠 잘 사용되지 않는 방법입니다. @Configuration 클래스 내부에 @Bean 메서드로 선언하는 방법도 있습니다. 마지막으로 가장 많이 사용되는 ..