본문 바로가기

가치관 쌓기69

소프트웨어 아키텍처? 그거... 먹는건가? 마틴 파울러의 소프트웨어 아키텍처의 중요성이라는 동영상을 약 3번이상 반복해 재생했습니다. 소프트웨어 아키텍처는 무엇일까? 여전히 풀리지 않지만- 마틴파울러의 동영상을 계속해서 살펴보면서 느꼈던 저의 생각을 적어볼까 합니다. 내가 알고 있는 소프트웨어 아키텍처는 무엇이였을까? 짫게 이야기해보면 '내가 속해있는 팀의 리더가 어떤 도구를 사용할 것인지 결정해 팀원들에게 알려주면 팀원들은 리더가 정해준 도구를 활용해 아키텍처를 설계한다.' 라고 정의할 수 있지 않을까요? 조금 더 이야기해보면 미리 모든 설계가 되어 있거나, 어떤 개발 도구를 선택해야 될 때 내가 아닌 누군가에 의해 결정되어져 나에게 오는 것이라는 생각이 강했습니다. 반대로 팀장의 입장에서 생각해봐도 팀원들과 논의하기 보단, 독단적으로 결정하고.. 2021. 9. 2.
Layered Architecture 의 단점이 무엇이라고 생각하는가? 들어가기 이전 포스팅의 내용이였던 DDD-Lite 동영상 시청 리뷰 의 내용을 정리하다가 문득 궁금증이 생겼습니다. 정명주 강사님께서 `Layered Architecture 의 단점으로 인해, Hexagonal(Onion) Architecture 가 나왔다.` 그럼 어떤 단점이냐? 바로 ~ 계층형 아키텍쳐의 단점은 무엇이냐면? 결국에는 도메인이 인프라에 의존하게 됩니다. 이 말은 즉, 도메인 관심사와 기술적 관심사가 섞이게 된다는 것을 의미합니다. 라고 동영상 중간에 말했습니다. 여기서 저는 왜? 도데체 왜 섞이지? 라는 생각을 하게 되었습니다. LayeredArchitecture 가 무엇인가? 우리가 흔히 알고 있는 LayeredArchitecture 는 여러 군데에서 사실 발견할 수 있습니다. 제가 .. 2021. 7. 26.
직접 코딩으로 느껴본 Spring Data JPA와 Spring Data JDBC 의 차이점 기존의 트랜잭션 스크립트 패턴으로 구현된 코드를 JPA로 변경해보면서 의존성을 분리하고, 다시한번 트랜잭션 스크립트 패턴으로 구현된 코드를 Spring Data JDBC (Spring JDBC와는 다른 Spring Data 에서 제공하는 라이브러리입니다.) 로 변경하면서 느꼈던 차이점에 대해서 작성할 예정입니다. Github - https://github.com/LenKIM/jwp-refactoring 트랜잭션 스크립트로 작성된 코드의 브랜치 - step1 JPA로 구현된 코드의 브랜치 - step3 Spring Data JDBC 로 구현된 코드의 브랜치 - try-spring-jdbc-step2-service Index Referance 에서 말하는 Spring Data JDBC와, JPA의 차이점 내.. 2021. 7. 18.
[우아한테크코스Pro] 서비스 진단하기 - 1 (Logging) [6/9] [목표] Spring 의 로깅을 남길 수 있다. 웹 성능을 테스트 할 수 있다. 스프링 프레임워크에서는 LogBack을 활용해서 로그를 남길 수 있다. 공식 사이트 Spring boot 는 Commons Logging(org.apache.commons.logging) 를 사용하는데, 기본 설정자로서, Log4J2, Java Util Logging, 그리고 오늘 우리가 알아볼 LogBack 을 사용합니다. Logging 의 Level 은 총 크게 4단계로 나눠집니다. ERROR - 예상하지 못한 심각한 문제가 발생하여 즉시 조사해야 함. WARN - 로직상 유효성 확인, 예상 가능한 문제로 인한 예외처리 등을 남김, 서비스는 운영될 수 있지만, 주의해야 함. INFO - 운영에 참고할만한 사항으로, 중요한.. 2021. 7. 16.
[우아한테크코스Pro] 인수 테스트 기반 TDD - 2 [5/9] [목표] 인수테스트 기반 TDD을 도와주는 RestAssured 를 이해할 수 있다. 언제 인수테스트 기반 TDD 를 사용하는 것이 적절한지, 이해할 수 있다. 왜 인수테스트 기반 TDD를 사용하는 것이 적절한지 이해할 수 있다. 어떻게 인수테스트 기반 TDD를 사용하는 것이 적절한지 이해할 수 있다. 인수테스트 기반 TDD을 도와주는 RestAssured 를 이해할 수 있다. RestAssured 의 공식사이트 RestAssured 는 REST service 를 테스트할 때 도움을 주는 테스트 도구 이다. 우리가 흔히 사용하는 GET, POST, PUT, DELETE 메소드를 지원한다. 만약, GET lotte/5 을 했을 경우 아래와 같은 경우가 나온다면? 아래 내용은 RestAssured 공식 사이.. 2021. 7. 14.
이력서 리팩토링 워크숍 강의 후기 이력서를 작성할 때는 가장 먼저 어떤 개발자가 되고싶은지 아는 것이 중요하다. 해당 워크숍을 진행하면서, 딱 한 가지 생각했으면 하는 것이 있다. "나를 채용해야 하는 이유는?" 강의를 듣는 내내 위 질문에 대한 답변을 고민하는 것이 중요했습니다. 위 질문에 대한 답변은 어떻게 되든 "회사에 직접적으로 기여할 수 있는 역량으로 어필해야 한다." 그러므로, 내가 가진 역량을 회사에 기여할 수 있는 내용이 무엇인지 고민해보자. -- 이력서는 누가 읽는가? 사람이 읽기 때문에 읽기 편해야 한다. 어떤 사람이 읽는가? 개발리더에게 매력적이어야 한다. 읽기 편해야 한다. 간결체로 써야 한다. 한 문장이 길어서는 안된다. 주어와 서술어가 명확해야 한다. 한 문단에는 하나의 주장만 담는게 중요하다. 마치 단일 책임의.. 2021. 7. 7.
[우아한테크코스Pro] 인수 테스트 기반 TDD - 1 [5/9] 5주차 인수테스트 기반 TDD에서는 3주차에서 했던 인수테스트 주도 개발 에서 말하는 인수 테스트 이후 개발 흐름에 대해서 미션이 주어졌습니다. 이번 미션에서는 총 4단계로 구성되어 각 단계마다 많은 코드 작성이 요구되었습니다. 이번 미션 목표 테스트 주도 개발 접근 방법을 이해할 수 있습니다. 단위 테스트에 대한 이해를 높일 수 있습니다. 테스트 주도 개발을 접근하는 방법으로 크게 2가지가 있습니다. 1. Outside In 일반적으로 TDD는 Inside-Out 의 방식을 말합니다. 그러므로, Outside-In는 Top Down으로 진행하고, London School TDD라고도 부르고, Mockist Approach라고도 불린다고 합니다. 아래 그림 1 에서 보여지는 것과 같이 최상위 레이어에서 .. 2021. 7. 1.
[우아한테크코스Pro] 그럴듯한 서비스 만들기 - 2 [4/9] 이번 미션에서 했던 작업 진짜 운영하는 듯한 서비스 구성하기(with Bastion Server) 웹 애플리케이션 앞단에 Reverse Proxy 구축하기 nginx에 TLS 설정하기 진짜 운영하는 듯한 서비스 구성하기(with Bastion Server) Bastion Server 란 무엇인가? Bastion의 의미는 성 외곽을 보호하기 위해 돌출된 부분으로서 적으로부터 효과적으로 방어하기 위한 수단입니다. 서비스를 구성하는 과정에서도 보안을 한 작업으로서 Bastion Server 를 구축합니다. 이 서버에 침입 차단 소프트웨어가 설치되어 내부와 외부 네트워크 사이에서 일종의 게이트 역할을 수행하는 호스트를 뜻합니다. - 출처 펜타시큐리티시스템 EC2에서 Bastion 을 위한 EC2를 생성합니다. .. 2021. 7. 1.
[우아한테크코스Pro] 그럴듯한 서비스 만들기(network) - 1 [4/9] 이번 4주차에서는그럴듯한 서비스 만들기 라는 주제를 가지고 미션에 참여했습니다. AWS 를 활용해 네트워크를 구성하며, 네트워크 기본 개념을 학습했습니다. 위와 같은 네트워크 망을 구축하기 위해서 네트워크 지식으로, OSI 7 Layer Router, Internet gateway subnet Swich 에 대한 이해가 필요합니다. L2 Switch Multiple Access 를 위한 장비로서, 서버에는 Network Interface Card 가 있습니다. 그 Card에는 각 장비의 주소를 나타내는 MAC 주소가 담겨져있습니다. 담겨져 있는 주소를 보고, 패킷의 충돌이 일어나지 않도록 패킷의 목적지로 지정할 포트를 직접 전송합니다. 스위치에서 패킷의 목적지 주소를 기준으로 보내는 곳과 받는 곳을 계산.. 2021. 6. 17.
[우아한테크코스Pro]인수테스트 주도 개발[3/9] 인수테스트 주도 개발이란 무엇인가? 개인적인 생각으로서, 설명할 때테스트 주도 개발(TDD) 의 단점을 해소시켜주는 개발론 중 하나라고 말씀드리고 싶습니다. TDD 라는 것은 실패한 테스트케이스를 작성하고, 이를 통과시키면서 개발해나가는 방법을 말합니다. TDD 단점으로 생각해보면, 실패한 테스트라는 것을 무엇을 어디에서부터 어떻게 테스트를 해야될지? 판단하기 어렵다는 부분에 있습니다. 이런 문제를 해소시켜 주는 개발 방법론으로서 인수주도 테스트 개발 이라는 것이 나옵니다. 어떻게 이런 부분을 도와줄수 있을까요? 이부분을 학습하기 위해서 우아한테크캠프pro 에서는 3주차 과제로 인수 테스트 주도 개발을 체험해볼 수 있는 시간을 가졌습니다. 이미 어느정도 작성된 코드를 Fork 받아, 인수테스트 를 작성하.. 2021. 6. 15.
[우아한테크코스Pro]QnA 서비스(JPA)[2/9] 이번 2주차 미션은 JPA를 학습하는 한 주였습니다. 매번 느끼는 거지만, JPA 는 학습한다고해서 아는게 아닌것 같습니다. JPA는 진짜 백문이불여일타 의 대표적인 모범예제이지 않을까 싶습니다. 작업 내역 [1단계] 엔티티 맵핑하기 create table answer ( id bigint generated by default as identity, contents clob, created_at timestamp not null, deleted boolean not null, question_id bigint, updated_at timestamp, writer_id bigint, primary key (id) ) 위와 같은 SQL 을 그대로 엔티티 만들기 @Entity @Where(clause = "d.. 2021. 6. 6.
[우아한테크코스Pro]로또 구현(테스트 주도 개발) - 못다한 이야기 이전에 로또 TDD 에 대한 내용을 블로깅한 적이 있습니다. https://happy-coding-day.tistory.com/170 들어가기 모든 구현을 마치고, PASS 까지 받은 상황에서 미쳐 생각하지 못했던 내용에 대해서 이야기해볼까 합니다. 이전 블로그에서도 말했다시피, 아래 생활 체조 원칙을 명확히 지키면서 코딩해야 합니다. 원시값도 포장한다는 말은 int 값 또한 인스턴스로 만들어 개발해야 한다는 의미입니다. 경험할 객체지향 생활 체조 원칙 규칙 1: 한 메서드에 오직 한 단계의 들여쓰기만 한다. 규칙 2: else 예약어를 쓰지 않는다. 규칙 3: 모든 원시값과 문자열을 포장한다. 규칙 5: 줄여쓰지 않는다(축약 금지). 규칙 8: 일급 콜렉션을 쓴다. 캐싱인스턴스 클래스 중에 LottoN.. 2021. 6. 3.
[우아한테크코스Pro]로또 구현(테스트 주도 개발)[1/9] 들어가기 이번 한 주동안 우아한테크코스Pro 에서는 테스트 주도 개발로 로또를 구현하는 미션을 받았습니다. 처음에는 간단할 줄 알았던 미션도 하다보니, 생각해야 될 부분- 고민해야될 부분- 생각보다 많았습니다. 특히, 코드를 작성하면서 지켜야 할 부분으로 다음과 같습니다. 경험할 객체지향 생활 체조 원칙 규칙 1: 한 메서드에 오직 한 단계의 들여쓰기만 한다. 규칙 2: else 예약어를 쓰지 않는다. 규칙 3: 모든 원시값과 문자열을 포장한다. 규칙 5: 줄여쓰지 않는다(축약 금지). 규칙 8: 일급 콜렉션을 쓴다. 위 규칙은 읽을 때는 간단해 보일지라도, 코드를 작성하는 과정에서 2개의 선과악이 공존하게 만드는 규칙들이였습니다. 고민을 했던 부분 1. 이름 짓기 클래스 이름을 포함해서 패키지를 설계하.. 2021. 5. 28.
우아한테크코스Pro 프리코스 후기 [PR 코드] https://github.com/next-step/java-baseball-precourse/pull/351 [김정규] 프리코스 미션 제출합니다. by LenKIM · Pull Request #351 · next-step/java-baseball-precourse 프리코스 미션 제출합니다. README.md 에 구현할 기능 목록 리스트를 나열하고, 각 기능 목록을 구현하기 위한 테스트 목록은 Todo.md 에 작성하여 개발했습니다. 모든 기능 개발을 마치고, 테스트 코 github.com https://github.com/next-step/java-racingcar-precourse/pull/224 [자동차 경주 게임] 김정규 미션 제출합니다. by LenKIM · Pull Request.. 2021. 5. 17.
빠르게 실패하기(fail-fast) VS 안전하게 실패하기(fail-safe) 이 주제에 대해서 "엘레강트 오브젝트-조영호 번역" 책에서 다루고 있습니다. 이론상으로만, 이해하고 있었습니다. 그러나, 최근 사내 서비스를 트러블 슈팅하며, 다른 분의 코드를 리뷰하며 이 주제에 대해서 말할 수 있었던 기회가 있었습니다. 그러나, 역시 이론과 코드에는 거리감이 있었고, 그 상황에서 저또한 명확하게 설명하기 힘들었습니다. 저 스스로는 빠르게 실패하기 를 실천하기 위해서 코드 상에서 노력하고 있는데, 이것을 누군가에게 설명하려니 잘 안되더군요. 그래서 팀원분에게 이 부분을 설명해주면서 헀던 이야기를 공유합니다. 먼저 빠르게 실패하기와 안전하게 실패하기에 대해서 이론으로 살펴보고 난 뒤에, 코드로서 살펴보겠습니다. 이 두 가지는 적절한 상황에 잘 활용하는 것이 중요하지만-, 만약 코딩 중에 .. 2021. 4. 16.
계약에 의한 설계(Contract By Design) 더 잘 활용하기(with java) 들어가기 계약에 의한 설계(Contract By Design) 라는 용어에 대해서 조영호님의 Object 책에서 처음 접하게 되었습니다. 계약에 의해 설계가 이루어지지 않는 코드에서 발생하는 문제점을 운영중인 프로덕트 코드에서 쉽게 발견할 수 있었고, 이를 계기로 사내에 '계약에 의한 설계' 라는 이름으로 세미나까지 하게 되었습니다. 발표자료 그러나, 발표를 하면서도 '실제 동작되는 코드에서는 어떻게 '계약에 의한 설계' 를 지킬 수 있을까?' 라는 생각을 했습니다. 실제로 계약에 의한 설계(Contract By Design) 를 준수하기 위해서 구글이 만든 cofoja 라는 라이브러리도 있고, vanilla4j 라는 라이브러리도 있었습니다. 하지만 이 두 개의 라이브러리를 적극적으로 활용하지 못한 이유.. 2021. 4. 5.
Getter와 Setter는 왜 써야 할까? 꼭 써야될까? 들어가기 엘레강트 오브젝트 책을 읽으면서, getter, setter에 대해서 궁금증을 가질 수 있었습니다. 자바 진영에서는 Lombok 때문에라도 Getter, Setter를 더욱 편하게 쓸수 있습니다. 또한, 뜻이 맞는 이와 소통하는 방에서도 비슷한 질문이 나와서 아래와같이 답변했습니다. 왜 Getter와 Setter를 사용할까? Getter와 Setter를 이해하기 위해선는, 자료구조와 객체의 차이점을 먼저 이해해야한다고 생각합니다. 클린코드에서나 또는 구글에서 객체와 자료구조에 대한 차이점을 검색하면 여러 결과물이 나옵니다. 몃가지 내용을 정리하면 아래와 같습니다. 객체와 자료구조의 차이점은 무엇일까? 객체는 추상화된 인터페이스 뒤로 자료를 숨긴 채 데이터를 다루는 함수만 공개합니다. 자료구조는 .. 2021. 2. 27.
동시성에 대해서 생각해보자. 하나의 자원에 여러 프로세스 또는 스레드가 사용하려고 할 때. 사용되는 영역을 임계영역이라 하고, 자원을 점유하기 위해 여러 동시성제어를 할 수 있는 도구를 사용한다. 그럼 여러 동시성제어를 할 수 있는 도구란 무엇을 말하는가? 개념적으로는 뮤텍스, 세마포어, 모니터 가 있을 것이고 실제 코드는 `java.util.concurrent` 패키지에 담겨있다. 그 외 실행자 프레임워크, 동기화 장치(synchronizer) 등이 존재합니다. Java에서는 실행자 프레임워크를 통해서 작업하길 권고하고 있다. [이펙티브 자바 Item81] 그 이유는 위에서 언급한 뮤텍스, 세마포어, 모니터를 조작하기 위해서 wait, notify와 같은 코드를 작성해 동시성을 제어해야 하는데, 이때 복잡성이 더 커지기 때문이다... 2021. 2. 9.
문제의식 갖기 재택근무...라고 말하고 재택지옥이라 말한다. 재택근무를 시작한지 이제 약 2달이 되어간다. 처음에는 출퇴근 시간을 줄여, 시간을 효율적으로 쓸 수 있다는 나의 생각과는 달리- 더 관리해야만 하는 것들이 늘어나고, 출퇴근을 했었더라면 하지 않았을 일들이 발생했다. 그 행동의 원인은 내가 아닌 남에게 찾기 일쑤였고, 온전히 결과를 받아들이기가 쉽지 않다. 또한, 무엇을 해야한다. 라는 목표의식이 부족했던 탓일까? 해야만 하는 것들은 늘어나지만, 정작 내가 움직이는 것은 더욱 없었다. 재택근무를 실시하면서 가장 힘들었던 부분으로 아래 4가지가 제일 컸다. 1. 시간 관리 2. 근무 환경 조성하기 3. 업무 협력하기 이 4가지가 가장 힘든 부분이지 않을까 싶다. "않을까 싶다." 않을까 싶다 라고 말하는 이유.. 2021. 1. 28.
JPA 연관 관계를 명시(사용)하는 이유는 무엇일까? 이 글을 작성하기 앞서, 절대 이 글은 JPA가 RDBS와의 패러다임 불일치를 해결하는 좋은 도구라는 것을 인지하고 있으며, 아래 글을 앞서 언급한 내용을 말하고자 작성한 것이 아니기 때문에 이 점 유의부탁드립니다. 아래 내용은 어디까지나 제 의견일 뿐이고, 맞지 않을 수도 있습니다. 스프링 부트를 활용하는 프로젝트에서 대부분 우리는 ORM으로 JPA를 사용합니다. 왜 그럴까요? 저같은 경우 인프런의 김영한님의 강의를 들으면서 JPA는 RDMS와 객체지향의 패러다임 불일치를 해결해주는 좋은 도구라는 것을 시작으로 JPA를 학습해왔습니다. 또한 개발 트랜드 라는 것이 한 몫했던건 아니였을까 싶기도 합니다. 아마도 앞서 말한 개발 트랜드는 아래와 같은 그래프를 말하는 거겠죠? 이런 행위가 혹시 귀찮다고 여기.. 2021. 1. 16.