DDD 질문에 대한 생각 정리

질문 질문자에게 전달해야겠다고 생각한 내용 일단 (계획없이) join 사용은 피하자. RDBMS만 영속(persistence)가 아니다. ORM은 객체가 persistence가 되는것이다. 객체지향 설계는 DDD와 맥락을 같이한다. DDD가 잘되면 MSA는 자연스러운 것. 질문에 대한 내 생각 정리 전회사에서 개발 좋아하는 성향의 사람들이 모여서 퇴사후에도 종종 수다를 떠는 (내가 애정하는) 카톡방에서 계신 프론트 개발자분께서 DDD란 주제로 질문을 해주셨다.(백엔드도 잘하심) 내 주위에 DDD 잘한다고 말하시는분 찾기 힘들고 나역시도 DDD에 전문가라고 말하고 다닐만큼 역량이 되지 않는지라 이 주제에 대해 글을 쓰는건 두렵지만 이렇게 글을 남기면 내가 잘 못 알았던 부분에 대한 피드백도 받을 수 있을거란 기대감에 지인께서 질문하신 DDD에 대한 내 생각을 풀어보겠다.

Intellij gradle 빌드가 너무 오래 걸릴때.(1분이상)

문제상황 필자가 코딩테스트를 했었는데 빌드만 인텔리제이에서 1분이 넘게 걸리는 묘한 상태에 빠졌었다.(아래 이미지 참조) 여태 이런적이 없었는데 가는 날이 장날이라고 꼭 바쁜 상황일때 이런 일을 겪는거 보면 난감하기만하다. 당시에는 시간이 급해서 환경세팅을 다시할 자신이 없었기에 최대한 빌드를 적게하는 방향으로 진행을 했지만 (180분 코테에 10번만 빌드를 해도 10분이 훌쩍 지나가는데 최소 30번 이상을 했으니…. 계속 값을 확인해야했으므로 실행을하려면 빌드가 필수였다.) 오늘 intellij를 키려고보니 예전 빌드가 잘 안되던게 생각이 나서 이 부분을 바로 잡으려고 세팅중에 나와 같은 문제를 겪을 사람들이 있을거라 생각이 들어 글로 정리를한다.

KSUG 20201120 답변 - (xxxParam, xxxVO, xxxModel, xxxDTO, xxxEntity 같은 개념으로 여러개 만들어서 사용하는 것이 조금 비효율적이라는 생각이 들어 글을 올립니다)

질문 안녕하세요. 클래스 설계 관련 질문드립니다. MVC 패턴에서 모델에 해당하는 클래스가 있는데요. 이 녀석이 JPA Entity 인 경우, API 요청을 통해 Controller 의 @ModelAttribute 로 넘어오는 경우, 또 다시 API 응답으로 표현되는 경우에 클래스가 같은 대상을 표현하고 있지만 프로퍼티 내용이 조금씩 다른 경우가 굉장히 빈번합니다. 이런 경우 보통 어떻게 처리하시나요? xxxParam, xxxVO, xxxModel, xxxDTO, xxxEntity 같은 개념으로 여러개 만들어서 사용하는 것이 조금 비효율적이라는 생각이 들어 글을 올립니다. 답변자가 생각할 때 질문자에게 전달해야한다고 생각하는 내용 레이어 구분에 대한 이해.

왜 Sqler는 JPA 쓸 때 다들 힘들어할까?

들어가며 개구리 올챙이적 기억못한다고 나의 경우는 잘 모르겠지만, 주변 동료 개발자들이 mybatis, jdbctemplate등으로 sql을 사용하며 개발을 했던 경험자들은 JPA로 넘어오면서 백이면 백 힘들어하는 모습을 보았다. 대체 무엇이 그들을 힘들게 하는 것일까? 이전부터 정리하고 싶었던 글이기에 키보드 앞에 섰다. SQL에서 JPA로 전환시 무엇이 허들일까? 먼저 답만 생각해본다면 기존에 개발했던 경험들이다라고 생각해본다. 기존에 설계라고하면 db 스키마 설계를 떠올렸는데 JPA를 사용하면 설계는 객체 모델링이 된다. 사실 이 둘의 차이는 별거 아닌데 지도 같은거라 직진으로 금방 갈 수 있는데 결국에는 목적지에는 도달하지만 꾸불꾸불 긴 길을 오랜 시간을 들여 목적지에 돌아가는 것과 비슷한 느낌을 받는다.

Jpa Join Fetch 관련 질문받은 것에 대한 정리

들어가기 앞서. 글로 정리하기전에 작성한 코드는 https://github.com/boojongmin/boojongmin-samples/tree/master/java/sample-spring-jpa-join-fetch 이 링크에서 확인할 수 있습니다. 문제상황 응답 api가 기대하는게 [ { id: 1, list: [ { id: 1, isDel: false }, { id: 3, isDel: false } ] } ] 이런식으로 parent Entity가 child Entity의 isDel이 false 것만 조회를 해야하는데 [ { id: 1, list: [ { id: 1, isDel: false }, { id: 2, isDel: true }, { id: 3, isDel: false } ] } ] 실제로 조회를 해보니 isDel에 true인 것이 나옴.

KSUG 20201110 답변

자야하는 관계로 간단하게 작성. 질문 질문자가 모르는 것 gradle의 task에 대한 이해. 답변 안녕하세요! 젠킨스와 Git Gradle을 이용해 스프링프로젝트를 AWS에 배포하는 공부하면서 궁금증이 생겨서 질문드립니다. 1. git에서 특정 브랜치에 푸시 -> git hook이 젠킨스에 걸려서 jenkins에서 파이프라인 실행 -> jenkins 안에서 gradle test를 실행 -> 테스트실패할 경우 CI가 실패했다는 알림을 슬랙으로 알림 이러한 과정을 생각하고 있는데, 마지막 gradle test를 실행한 후에 테스트 실패시 pipeline job들을 멈추려고 하는데 이게 가능한가요? 2. gradle build를 실행할 경우 gradle build안에는 jar로 압축하는 task와 test를 실행하는 task가 따로 동작하게 되어서 테스트가 실패해도 jar가 생성되더라구요!

KUSG 답변 20201110

질문 답변 파이썬의 함수나 라이브러리를 활용하여 데이터 전처리를 쉽게할수 있는 것을 만들고 있습니다. 네 파이썬 판다스 같은게 데이터 처리하기 참 좋긴하더군요. 저는 react -> springboot -> flask 아키를 고민하고 있습니다. 여기 문맥에서 굳이 react를 언급하지 않으셔도 될 것 같은데. 글을 통해 대중적이며 모던한 기술셋을 지향하신다는 것을 느낄수 있네요. 여기서 java는 직접 db처리없이 오직 flask에서 처리하려고합니다. 이런구조에서는 혹자는 이렇게 부르더라고요 기존에 자바를 백엔드라고 불렀던것을 | front | backend | react ----- java ------ database | front | backend | react ----- java ------ flask ----- database 제가 java로 servlet으로 프로그램을 만들더라도 view engine으로 view layer를 만들어서 저보고 프론트 개발한거라고하더군요

Webflux NioEventLoop 살짝 살펴보기

들어가기전 웹플럭스 이벤트루프 소스를 언제는 보겠다 생각했었는데. 어쩌다보니 이제 보게되었다. 뒤돌아서면 까먹으니 간단히 메모형태로 정리 본론 io.netty.channel.nio.NioEventLoop NioEventLoop는 독립된 Thread로 실행되므로 run메서드가 최초 동작. for(;;)에서 보면 알 수 있듯이 무한 loop를 돌리고 client 요청이 오면 저 selectCnt에 값이 1 증가함. 요청이 들어오면 processSelectedKeysOptimized 메서드에서 위의 netty가 만들어주는 selectedKeySet에서 값을 가져와서 처리 unsafe.read() 이후 client 요청 데이터를 읽는 것으로 보임(TODO bytebuffer로 읽기는 하는데 어디에 저장하는지 살펴봐야함.) io.netty.handler.codec.ByteToMessageDecoder 에서 byte에서 http 전문(문자열)을 만들어냄.

20201108 KSUG 질문 답변

페이스북에서 KSUG 커뮤니티 글을 보다가 위와 같은 질문글을 보았는데 댓글로 달기에는 내용이 너무 많아서 죽어있던 블로그를 심폐소생해보았다. 10개의 요청이 있고 이요청들이 모두다 DB에서 데이터를 가져 오느라 IO 요청에 시간이 걸린다면. 이것둘은 모두 Mono로 우선 리턴이 되고. 스프링 어딘가에 맵같은곳에 쌓여 있나요? 리액티브에 대한 이해가 필요한 부분입니다. 정답만 말씀드리면 db에서 데이터를 가져올때까지 다음 코드가 실행되지 않습니다. map같은데에 저장하지는 않고 thread가 block을 하고 있는 것과 비슷합니다. db에서 데이터를 다 가져오면 mono의 다음 동작이 실행됩니다.