전체273 [책] 도메인 주도 설계 철저 입문 - 나루세 마사노부 리뷰 아마도 올해 초부터였을까? Slipp 커뮤니티에서 사이드 프로젝트를 하기 위해 지인에서 Join을 부탁했을 때부터 도메인 주도 설계는 끊임없이 나의 꼬리표를 달게 되었습니다. 사이드프로젝트내에서 먼저 도메인 주도 설계론을 창시한 에릭 에반스의 책을 처음 접하게 되었습니다. 이 책을 읽으면서 느꼈던 점은 도메인 주도 설계라는 것은 서비스내에서 정말로 중요한데, 코드로서 이를 표현하는 방법은 무엇이 있을까- 어떻게 해야될까? 라는 고민이 있었습니다. 이 책을 어느 정도 읽었을 쯤, 그 다음 책으로 반 버논의 '도메인 주도 설계 구현' 를 읽기 시작했습니다. 제가 필요로 했던 드디어 코드로서 도메인 주도 설계를 설명해주면서 개념 하나하나를 이해해 나갔습니다. 그러나, 읽으면서도 정말 포기하고싶다는 생각을 10.. 2020. 10. 29. 생명주기를 갖는 객체 - 엔티티(Entity)란? 엔티티라는 용어는 소프트웨어 개발에서 다방면으로 사용된다. 예를 들면 JPA에서도 도메인을 지정할 때 Entity라는 애노테이션을 붙이고, 어떤 식별자를 가진 객체를 만들때 이를 엔티티라고도 부른다. 물론 ORM과 같은 JPA에서 말하는 JPA와 도메인주도설계에서 말하는 엔티티는 조금 다른 의미를 가진다. 1. 엔티티란? 도메인 주도 설계에서 말하는 엔티티를 설명할 때는 식별성또는 개별성, 동등성 비슷하지만 다른 명칭으로 설명하는데, 여기서 저는 에릭에반스의 저서에서 나오는 식별성으로 엔티티를 설명하고자 합니다. 어떤 객체를 일차적으로 해당 객체의 식별성으로 정의할 경우 그 객체를 ENTITY라 한다. ENTITY에는 모델링과 설계상의 특수한 고려사항이 포함돼 있다. ENTITY는 자신의 생명주기동안 형.. 2020. 10. 28. 도메인 모델링이란? 에릭에반스의 도메인 주도 설계에서는 소프트웨어 시스템의 일부를 설계할 때는 도메인 모델을 있는 그대로 반영해서 설계와 모델의 대응을 분명하게 하라. 또한 모델을 재검토해서 더욱 자연스럽게 소프트웨어로 구현될 수 있게 수정하라. 도메인에 관한 심층적인 통찰력을 반영하려 할 때도 마찬가지다. 이렇듯 견고한 UBIQUITOUS LANGUAGE를 지원하는 것과 더불어 분석과 설계의 두 가지 측면을 충분히 만족하는 단 하나의 모델을 만들어내야 한다. 모델로부터 설계와 기본적인 책임 할당에 사용한 용어를 도출하라. 코드를 작성할 때 그러한 용어를 사용하면 코드가 모델을 표현한 것이 되고, 코드의 변경이 곧 모델의 변경으로 이어질 수 있다. 그 효과는 프로젝트의 나머지 활동에도 퍼져나가야 한다. 구현을 모델과 그대로.. 2020. 10. 25. 4. Gradle 프로젝트에서 Swagger Codegen 적용하기. SwaggerCodeGen CLI 에 대한 설명은 이전에 했었습니다. 이제부터는 Gradle 프로젝트에 SwaggerCodegen을 적용하는 방법에 대해서 알아보겠습니다. 먼저 Gralde SwaggerCodegen Plugin 을 알아야 합니다. 저 또한 여기 나온 메뉴얼대로 진행했습니다. 당연히 우선적으로 행해져야 하는 부분은 의존성을 추가하는거겠죠? plugins { id 'org.hidetake.swagger.generator' version '2.18.2' } repositories { jcenter() } dependencies { swaggerCodegen 'io.swagger:swagger-codegen-cli:2.4.2' // Swagger Codegen V2 swaggerCodegen .. 2020. 10. 18. 3. Swagger CodeGen CLI 는 무엇인가? API First Design 를 외치면서 활용했던 도구로, Swagger Codegen CLI를 활용했습니다. 해당 도구를 활용한 프로젝트 소스코드는 여기를 참조해주시면 됩니다. Swagger Codegen CLI은 OPEN API Spec을 기반으로, Yaml 파일로 어떤 API 를 Request 하고 Response 할 지 정의를 해놓으면, Swagger Codegen CLI은 정의해놓은 Yaml 파일을 통해, 각 클라이언트에서 사용되는 통신 라이브러리를 활용해 코드를 생성해줍니다. 이는 개발자로 하여금, 개발의 편의성을 한껏 높일 뿐만아니라, 어떤 API를 사용하고 있는지에 대해서 변경되어야 하는 부분은 유연하고, 신속하게 대응할 수 있고, 개발자가 구현해야 되는 부분은 최소화로 만들어줍니다. 이.. 2020. 10. 18. '규칙 없음' No Rules Rules 책을 읽고 나서 "넷플릭스, 지구상 가장 빠르고 유연한 기업의 비밀" 이라는 부주제로, 저의 마음을 사로잡은 책 하나가 있습니다. 바로 넷플릭스의 CEO 리드 헤이스팅스가 작성한 규칙 없음 이라는 책입니다. 이 책을 읽으면서 느꼈던 첫번째는, 제 주변 환경을 돌아보게 만들었습니다. 더불어, 제가 있는 이 환경이 얼마나 근로자로 하여금 답답하게 만들고 있는지 여부를 판단할 수 있었습니다. Top-down 방식의 의사결정, 전자결재라는 것이 주는 통제, 휴가라는 것이 주는 통제, 관례라는 것을 따라야만 하는 현실. 차마 포스팅으로는 남기지 못하는 대외비 같은 이야기들... 이러한 환경을 탓하는 행위는, 잘못된 행위입니다. 그러나, 이 규칙없음 이라는 책을 통해 생각해볼 수 있는 거름을 만들어 준게 아닐까? 라는 생각이 듭니.. 2020. 10. 18. 마틴 파울러의 UnitTest 이해하기 - 번역본 원본 사이트 - martinfowler.com/bliki/UnitTest.html bliki: UnitTest Unit Tests are focused on small parts of a code-base, defined in regular programming tools, and fast. There is disagreement on whether units should be solitary or sociable. martinfowler.com 단위 테스트는 소프트웨어 개발에서 자주 언급되며 프로그램을 작성하는 동안 제가 익숙한 용어입니다. 그러나 대부분의 소프트웨어 개발 용어와 마찬가지로 매우 잘못 정의되어 있으며 사람들이 실제보다 더 엄격하게 정의되었다고 생각할 때 종종 혼동이 발생할 수 있습니다... 2020. 10. 18. 오케스트레이션(orchestration)과 코레오그래피 (choreography) 배경 저에게 마이크로서비스라는 것은 익숙하지 않은 분야입니다. 그래서 마이크로 아키텍처 구축 이라는 책을 읽으며, MSA에 입문하던 중, 이전에 봤던 용어인데, 익숙하지 않아서 몰랐던 용어 2가지. 오케스트레이션과 코레오그래피에 대해서 이해해보려고 합니다. 위 2개 용어는 최근 관심가는 프레임워크 eventuate.io/을 이해하던 중에 나와서 이렇게 다시 정리해볼까 합니다. 앞서 말했던 eventuate.io/프레임워크는 약결합을 통해 Saga와 CQRS 를 해결하는 좋은 오픈소스라고 판단되, 학습중에 있습니다. 어느 정도 정되면 포스팅 하겠습니다. 위 다이어그램을 활용해 오케스트레이션과 코레오그래피를 설명하겠습니다. 오케스트레이션 오케스트라 지휘자처럼 프로세스를 안내하고 구동하는 하나의 중앙 두뇌에 .. 2020. 10. 17. Hibernate, JPA, Querydsl는 과연 좋은 도구일까? Photo by Annie Spratt on Unsplash 오늘도 여전히 사이드프로젝트를 진행하며 함께 하는 형님과의 대화에서 또다른 깨달음을 얻었습니다. 들어가기 최근 회사에서 시간이 남아, Querydsl 을 사내서비스에 적용하는 방안을 고려하기 위해서 학습하던 중, 나왔던 이야기입니다. Querydsl, SwaggerCodegen, ProtocalBuffer 등의 도구들은 이전에 가졌던 문제를 제 3의 관점으로 넘겨, 개발자는 비지니스 로직에만 집중 할 수 있게 해준다는 관점에서 좋은 도구라는 이야기를 남겼었습니다. 그러나, 이전에 지인과 식사를 하면서 가볍게 Querydsl과 Jpa 의 단점을 이야기 하면서 나눴던 부분에 대해서 내용을 남겨두면 좋겠다 싶어 이렇게 포스팅하게 되었습니다. 우리가 .. 2020. 10. 16. @Fetch(FetchMode.SUBSELECT) 과 IN subquery 는 왜 느릴까? 들어가기 JPA 를 활용하다가 문제를 하나 맞딱뜨렸습니다. 퇴근하기 10분전, 동료분의 호출로 위 그림처럼 시간이 오래걸리는 경우가 발생했습니다. 처음 보는 코드에서 어디서 발생했는지 알 수 없는 상황에서 겉으로 보기에는 아무런 문제가 없었습니다. 그러던 중, 코드를 살펴보던 중 처음 보는 어노테이션 @Fetch(FetchMode.SUBSELECT) 가 있었습니다. @Fetch(FetchMode.SUBSELECT) 이란? JPA를 활용하다보면, N+1 문제는 늘 발생할 수 있는 문제입니다. N+1 문제를 해결하기 위해 다양한 방법 있습니다. 그리고, 그 가운데 Fetch(FetchMode.SUBSELECT) 이 있습니다. 그럼 이 애노테이션은 어떻게 N+1 문제를 해결할까요? 백기선님의 블로그를 참고하.. 2020. 10. 14. Richardson Maturity Model (번역본) 아래 내용은 마틴 파울러 블로그에서 가져온 글을 번역했습니다. steps toward the glory of REST REST 접근 방식의 주요 요소를 세 단계로 나누는 모델 (Leonard Richardson이 개발). Resources, http Verb 및 hypermedia controls을 소개합니다. 최근에 저는 Rest In Practice의 초안을 읽었 습니다. 동료 부부가 작업하고있는 책입니다. 그들의 목표는 기업이 직면하는 많은 통합 문제를 처리하기 위해 Restful 웹 서비스를 사용하는 방법을 설명하는 것입니다. 책의 핵심은 웹이 정말 잘 작동하는 대규모 확장 가능한 분산 시스템의 존재 증명이라는 개념이며, 우리는 통합 시스템을 더 쉽게 구축하기 위해 아이디어를 얻을 수 있습니다. .. 2020. 10. 4. LazyInitializationException 를 벗어나기 위해서는 어떻게 해야될까? JPA에서 최적의 쿼리를 보내는 방법은 무엇일까? Photo by Jan Antonin Kolar on Unsplash 들어가기 JPA의 연관관계를 사용하다 사용하지 않으니까, 금방 까먹고, 또다시 공부하는 제 모습을 보면서, 이 부분은 어느 정도 정리해야겠다는 마음으로 포스팅을 작성합니다. 이 글은 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 학습한 뒤, 일부 내용을 편집했습니다. 리뷰 전체적으로 김영한 강사님의 노하우가 '녹아내려있다' 라는 생각은 강하게 들었습니다. 당연하다고 여겨지는 부분이라도 직접 동작하는 코드로 이해하지 않는다면, 이해하지 않은 것이라고 했습니다. 그런 측면에서 이번 강의는 당연하지만 실행해보지 않았기에 몰랐던 부분을 잘 집어주는 부분이 많았습니다. LazyInitializationException 는 왜.. 2020. 10. 3. 대체 JPA에서 Proxy 로 초기화된다는 말이 뭔데? 들어가기 인프런에서 JPA관련 학습 동영상을 듣다가 LazyInitalization 의 경우, null로 Porxy가 초기화 된다는 말을 했었습니다. 그래서, 코드를 찬찬히 보니 어떤 가짜 객체를 만드는 것처럼 보였습니다. 이건 대체 무엇일까? 라는 고민으로 "다이나믹프록시" 에 대한 학습을 하게 되었습니다. 대부분의 내용은 백기선님의 더 자바, 코드를 조작하는 다양한 방법에서 발췌한 부분을 베이스로, 이를 제가 이해한 방식으로 풀어 적어내려가볼까 합니다. 스프링부트에서 디버깅을 하다 보면 자주 마주치는 이름이 바로 cglib 이라는 라이브러리입니다. 이 라이브러리는 코드를 생성해주는 것이라고 이해하고 있었고, 자세히는 몰랐었습니다. 인터넷에 검색을 해도 생각했던 것 만큼 자세히 나오지는 않았습니다. 그.. 2020. 10. 2. 마이크로서비스란? 해당 내용은 마이크로서비스 아키텍쳐 구축 책의 내용을 일부분을 정리한 포스트입니다. 들어가기 제가 근무하는 회사에서는 여전히 모놀리틱으로 구축되어 있고, 아직도 기억이 생생합니다. 근무중인 회사에서 인턴 당시, 어떤 팀장님께서 저를 시험하듯이 이런 질문을 했던적이 있었습니다. "마이크로서비스의 반대가 무엇인지 아는가?" 모놀리틱이라고 대답해서 칭찬을 받았었는데, 지금 생각해보면- 조금 기분이 언짢은 질문이라는 생각이 든다. 지금의 회사에 근무한지 2년이 지난 시점에 단, 한번도 MSA를 접해본 적도 없고, 이해하기 위한 노력이 필요하지 않았습니다. 그러나, 점차 서비스 개발 양상이 MSA로 번지고 있고, 이제는 커다란 줄기를 형성하고 있다고 생각했습니다. 그래서 주변에 추천을 받아 마이크로서비스 아키텍쳐.. 2020. 9. 30. 2. Swagger을 소개합니다. 들어가기 이전에 API First Design 설계에 대한 내용을 다뤄봤습니다. API First Design 을 실천할 수 있는 도구들은 다양하게 있습니다. 그 중에서 저는 오픈소스 Swagger 를 선택했습니다. 그렇다면 Swagger 가 무엇인지 간단하게 알아볼 필요가 있을 것 같아, 이렇게 소개하는 포스팅을 합니다. Swagger의 메인 페이지를 들어가면, 여기서 우리는 Swagger의 철학을 이해할 수 있습니다. Swagger의 오픈 소스를 사용해, 사용자, 팀 및 기업을 위한 API 개발을 단순화하세요. 메인 페이지에 나타낸만큼 Swagger 는 API 를 설계하기 위한 다양한 도구를 제공해줍니다. 그 도구들은 아래와 같습니다. 여기서 SwaggerHub는 클라우드 상에 아래 Swagger E.. 2020. 9. 30. 1. API First Design 설계의 선순환 들어가기 Slipp 에서 사이드 프로젝트를 진행하면서 API First Design 설계 라는 용어를 처음 접하게 됐습니다. 그리고 API First Design을 실천하기 위해 고군분투했던 내용들을 정리하면 좋을 것 같아 이렇게 내용을 내려적습니다. 아래 내용은 다우기술 전사 세미나에서 제가 발표했던 내용입니다. 슬라이드는 여기있습니다. 1. API First Design 이란 무엇을 의미하는 걸까요? "협업하는 개발 프로세스에서 API를 첫 번째 우선 순위로 가져가는 것." 위 그림은 로버트 C 마틴이 클린아키텍쳐에서 말하길, 약 8번의 릴리즈를 하면 처음보다 약 40배의 비용이 들어간다는 것을 말하는 그래프입니다. 우리가 운영하고, 서비스하는 회사들의 대부분은 위와같은 형태를 따릅니다. 제가 근무하.. 2020. 9. 30. Template Pattern(템플릿 패턴) VS Strategy Pattern(전략 패턴) Photo by Mike Meyers on Unsplash 들어가기 대부분의 디자인 패턴 책에서는 이 두가지를 비교해서 설명합니다. 왜 일까요? 이 두가지 패턴은 데이터를 은닉화 시켜 구현될 수 있도록 도와주는 패턴입니다. 각각의 쓰이는 상황은 다르지만, 결론부터 이야기하면 잘 짜여진 코드는 템플릿 패턴에서 전략 패턴으로 손쉽게 전환할 수 있고, 반대로 전략패턴에서 템플릿 패턴으로 손쉽게 변경가능하다고 합니다. 그럼 왜 그런지 한번 살펴봅시다. 템플릿 패턴이란 무엇인가? 하위 클래스에서 구체적으로 처리하는 디자인 패턴 개인적으로 패턴을 어렵게 생각하면 끝없이 어렵고 쉽게 생각하면 너무 쉽게 생각하는 경향이 있다고 생각합니다. 그런 예시로 템플릿 패턴도 포함됩니다. 부주제로 '하위 클래스에서 구체적으로 처.. 2020. 9. 27. 기본 타입에 대한 강박관념(primitive Obsession) 에 대한 이해 Photo by Miguel Bruna on Unsplash 리팩토링에 있는 책의 일부분을 저의 의견과 함께 발췌하여 적었습니다. 들어가기 "기본타입에 대한 강박관념" 이라는 개념은 객체를 처음 접하는 경우, 작은 특정 객체를 사용하는 것을 피하고 Primitive Type 만을 사용하려 하는 경향을 말합니다. 여기서 말하는 작은 특정 객체의 사용의 주요 장점은 기본 타입 클래스와 응용 클래스 간의 경계를 허문다는 점 에 있습니다. 그럼 작은 특정 객체라는 것은 어떻게 만드는 걸까? 우리는 이를 더 명시적이고 정확하게 표현하기 위해 행해져야 합니다. 가장 먼저 볼 것은, 데이터 값을 객체로 전환(Replace Data Value With Object) 데이터 항목에 데이터나 기능을 더 추가해야 할 때는 .. 2020. 9. 27. 알아야만 하는 Java.time API 총 정리[실무&고급편] 1. 날짜와 시간 조작하기 1.1. 날짜와 시간을 더하거나 빼는 메소드 LocalDate, LocalDateTime, ZonedDateTime 클래스는 각각 년, 월, 일, 주를 더하거나 뺄 수 있습니다. LocalDateTime currentDateTime = LocalDateTime.now(); LocalDateTime targetDateTime = currentDateTime .plusYears(long) // 년도 더하기 .minusYears(long) // 년도 빼기 .plusMonths(long) // 월 더하기 .minusMonths(long) // 월 빼기 .plusDays(long) // 일 더하기 .minusDays(long) // 일 빼기 .plusWeeks(long) // 주 더하기.. 2020. 9. 20. 알아야만 하는 Java.time API 총 정리[기본편] 들어가기 개발을 하다보면, 언젠간 마주치게 되는 날짜 관련 API. 자바의 경우 날짜 관련된 검색(ex, 7월의 한달은 몃일까?)을 하면 이전에 자바8 이전의 데이터가 비교적 많이 검색됩니다. 또한 Java 8에서 제공해주는 LocalDateTime 관련 API 를 사용하더라고, 그 라이브러리를 잘 모르니까 때문에 언젠간 한번 쯤 정리가 필요하다고 느꼈습니다. 이 포스팅 시리즈는 LocalDate, LocalTime 다 쓸 수 있다고 자부하더라도, Temporal 이 무엇인지 몰라서 헤매는 저같은 사람에게 꼭 필요합니다. 다음 포스팅으로 알아야만 하는 Java.time API 총 정리[실무&고급편] 추가했습니다. 0.LoadMap 기본편에서는 LocalDate, LocalTime, Instant, Dur.. 2020. 9. 20. 이전 1 ··· 7 8 9 10 11 12 13 14 다음