본문 바로가기

전체273

용병팀과 미션팀 - [인스파이어드] 책을 읽고 이직간에 약 2주간에 휴가중에 마티케이건의책 '인스파이어드' 라는 책을 읽었다. 사실 이 책은 이전회사 재직 중에 읽어보려고 했던 책 중에 하나였으나, 그 당시 '인스파이어드' 책을 약 50페이지 정도 읽을 적에 나에게 맞지 않는 책이라 판단하고- 책을 알라딘에 팔아버렸다. 그럼에도 불구하고 다시, 이 책을 편 이유는 최근 끊임없이 고민하고 있는 부분에 대한 해답을 알려줄거라는 믿음 때문이였다. 과거에는 인스파이어드 책이 맞지 않았다. 왜 이전직장에서는 이 책을 읽으려고 했을 때 맞지 않았다라고 생각했을까? '인스파이어드' 책에서는 프로덕트(Product) 라는 부분에 초점을 맞춘다. '우리가 프로덕트를 만드는 건 엔지니어, 디자이너를 포함해 많은 이해관계자가 서로 협업을 통해 하나가 되어 집중해야되고 .. 2021. 9. 13.
Thymeleaf CheatSheet - 2 (template layout) 공통된 영역은 따로 분리해서 개발해야 한다. 그런 부분에 대한 처리가 바로 템플릿 레이아웃이다. 3가지 방식이 있다. 1. 템플릿 조각 th:fragment 태그의 의미는 다른 곳에 포함되는 코드 조각이라 이해하면 된다. 어떻게 사용하는가? // footer.html 푸터 자리 입니다. 파라미터 자리 입니다. footer.html 에서 2개의 fragment 를 copy 와copyParam 선언했습니다. 그럼 선언한 fragment 를 사용한 부분은 다음과 같습니다. 부분 포함 부분 포함 insert 부분 포함 replace 부분 포함 단순 표현식 파라미터 사용 ~{...} 를 사용 와 같이 footer :: copy 사용 insert 와 replace 의 차이는 현재 태그가 어떻게 되는지에 대한 차이 .. 2021. 9. 6.
Thymeleaf CheatSheet - 1 (basic) Thymeleaf CheatSheet - 1 (basic) 1. 텍스트 - text, utext text vs utext th:text = th:utext = [[...]] vs [(...)] [[...]] = [[${data}]] [(...)] = [(${data})] = ${users[0]['username']} = ${users[0].getUsername()} = Map ${userMap['userA'].username} = ${userMap['userA']['username']} = ${userMap['userA'].getUsername()} = map 으로 선언된 객체일 경우 인텔리제이에서 인식하지 못하는 경우도 있는것 같다.. 2021. 9. 6.
소프트웨어 아키텍처? 그거... 먹는건가? 마틴 파울러의 소프트웨어 아키텍처의 중요성이라는 동영상을 약 3번이상 반복해 재생했습니다. 소프트웨어 아키텍처는 무엇일까? 여전히 풀리지 않지만- 마틴파울러의 동영상을 계속해서 살펴보면서 느꼈던 저의 생각을 적어볼까 합니다. 내가 알고 있는 소프트웨어 아키텍처는 무엇이였을까? 짫게 이야기해보면 '내가 속해있는 팀의 리더가 어떤 도구를 사용할 것인지 결정해 팀원들에게 알려주면 팀원들은 리더가 정해준 도구를 활용해 아키텍처를 설계한다.' 라고 정의할 수 있지 않을까요? 조금 더 이야기해보면 미리 모든 설계가 되어 있거나, 어떤 개발 도구를 선택해야 될 때 내가 아닌 누군가에 의해 결정되어져 나에게 오는 것이라는 생각이 강했습니다. 반대로 팀장의 입장에서 생각해봐도 팀원들과 논의하기 보단, 독단적으로 결정하고.. 2021. 9. 2.
SpringMVC 에서 말하는 MessageConverter 코드로 이해하기 SpringMVC는 어떻게 내가 보낸 요청 메세지를 찰떡같이 알아듣고 Json 등의 내가 원하는 값으로 반환해주는걸까? HTTP 메시지 컨버터에 대해서 조금더 자세히 알아보려고 합니다. 총 2가지로 나눠서 살펴볼 예정입니다. POST 방식의 Request 보낼시, @RequestBody 가 어떻게 Converter 되는지. GET 방식으로 Request 조회시, @ResponseBody가 어떻게 Converter 되는지 확인해볼 예정입니다. MessageConverter 종류 MessageConverter 의 종류를 이해하기 위해서는 먼저 HttpMessageConverter 가 무엇인지 알아봅니다. SpringMVC 에서는 인터페이스로 존재하는데, 아래와 같습니다. package org.springfr.. 2021. 8. 15.
DB 트랜잭션 조금 이해하기 - 최범균 유튜브 리뷰 최범균님 강의로 DB 트랜잭션 조-쪼금 이해하기 1,2 https://youtu.be/poyjLx-LOEU 개발자 관점에서 트랜잭션은 간단하게 여러 읽기/쓰기 를 논리적으로 하나로 묶음 트랜잭션 시작 - 여러 쿼리 실행 - 커밋 또는 롤백 모두 반영(커밋) 또는 모두 반영하지 않거나(롤백) 이런 트랜잭션이 없다면? 1.3 에서 실패할 경우, 1.2 업데이트을 취소할 수 있는 것을 구현해야 한다. 트랜잭션 범위는 커넥션 기준으로 합니다. 만약 5 에서 롤백될 경우, 4,3 의 롤백 되고, 그 뿐만 아니라 4.1 에서 롤백도 기대하게 됩니다. 그러나, 4.1 처럼 새로운 트랜잭션을 만들었다면 4.3 에서 이미 commit 되었기 때문에 롤백되지 않습니다. 여러 메소드를 호출할 때 하나의 트랜잭션으로 묶고 싶.. 2021. 8. 1.
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.
[2019] DDD Lite@Spring 동영상 시청 리뷰 DDD-Lite@Spring 세미나 내용이 유익하다고 판단되, 동영상을 보면서 정리한 내용입니다. 2번째 시청하면서, 정명주님이 생각하는 DDD에 대한 개념이 잘 녹아있고, 간결하게 DDD 에 대해서 설명해주셔서 정리하고자 합니다. 유지보수 사항에서 항상 개발자는 고통받습니다. 왜 그럴까요? 왜냐하면서, 애플리케이션이 엄청 복잡하기 때문입니다. 크게 2가지로 복잡합을 구분해보면 우리가 해결해야 할 문제 자체 우리가 사용하는 기술과 도구 위기가 어떻게 오는가? 빠르고 간단하게 일정 드리븐 개발을 하다보니까- 빠르고 간단하게 개발했는데, 요구사항이 변경되고 점점 복잡해지면서 빅뱅식 개편을 많이 하는데, 잘못된 레거시에 의존하기 때문에 이 순환이 반복됩니다. 원인은 빠르고 간단하게 맞지않는 접근법을 이용하다보.. 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.
State Pattern 이해하기 아래 내용은 클린 소프트웨어의 일부 내용을 재편집한 내용입니다. 스테이트 패턴 왜 이 패턴을 쓸까? 스테이트 패턴을 이해하기 위해서는 유한 상태 기계(FSM: finite state machine) 를 먼저 이해해보자. 이 다이어그램을 상태 전이 다이어그램(STD: state transition diagram) 이라 한다. 모서리가 둥근 상자는 상태(state) . 상태를 연결하는 화살표는 전이(transtion). 전이에는 이벤트(event) 의 이름과 그 이벤트에 따르는 행동(action) 이 이름표가 붙는다. 만약 기게가 Locked 상태가 있는데 coin 이벤트를 받는다면, unlocked 상태로 전이하고 unlock 행동을 호출 만약 기계가 Unlocked 상태에 있는데 pass 이벤트를 받는다.. 2021. 7. 14.
[우아한테크코스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.
성능테스트 k6 결과 내역을 이해해보자. 공식 사이트 중에서도 k6 의 결과를 설명해주는 페이지 를 보고 이해하고자 했습니다. data_received..............: 148 MB 2.5 MB/s data_sent..................: 1.0 MB 17 kB/s http_req_blocked...........: avg=1.92ms min=1µs med=5µs max=288.73ms p(90)=11µs p(95)=17µs http_req_connecting........: avg=1.01ms min=0s med=0s max=166.44ms p(90)=0s p(95)=0s http_req_duration..........: avg=143.14ms min=112.87ms med=136.03ms max=1.18s p(90)=1.. 2021. 7. 9.
docker 에 올라온 postgres 에 접속해, Database 확인하는 방법 InteliiJ 의 편리함에 속아, 실제 DB 작업할 때는 어버버한 저를 위해 남깁니다. 먼저, 작성하기 전에 데이터베이스의 목적은 영속성입니다. 그러나 Docker는 쉽게 지우고 설치할 수 있습니다. DB의 영속성과 Docker? 사실 말이 안맞긴 합니다만... 😳 우리는 개발환경을 빨리 세팅하고 싶으니까...ㅎㅎ 참조문서 - https://hub.docker.com/_/postgres 아래 명령어를 실행했다고 가정하겠습니다. docker run --rm --name mypg -d \ -v ${PWD}/app/src/main/resources:/docker-entrypoint-initdb.d \ -p 5432:5432 \ -e POSTGRES_PASSWORD="password" \ -e POSTGRES.. 2021. 7. 9.
이력서 리팩토링 워크숍 강의 후기 이력서를 작성할 때는 가장 먼저 어떤 개발자가 되고싶은지 아는 것이 중요하다. 해당 워크숍을 진행하면서, 딱 한 가지 생각했으면 하는 것이 있다. "나를 채용해야 하는 이유는?" 강의를 듣는 내내 위 질문에 대한 답변을 고민하는 것이 중요했습니다. 위 질문에 대한 답변은 어떻게 되든 "회사에 직접적으로 기여할 수 있는 역량으로 어필해야 한다." 그러므로, 내가 가진 역량을 회사에 기여할 수 있는 내용이 무엇인지 고민해보자. -- 이력서는 누가 읽는가? 사람이 읽기 때문에 읽기 편해야 한다. 어떤 사람이 읽는가? 개발리더에게 매력적이어야 한다. 읽기 편해야 한다. 간결체로 써야 한다. 한 문장이 길어서는 안된다. 주어와 서술어가 명확해야 한다. 한 문단에는 하나의 주장만 담는게 중요하다. 마치 단일 책임의.. 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.
[JPA] JoinColumn vs mappedBy mappedBy 와 @JoinedColumn 에 대해서 알아보기. @Entity public class Company { ... private String name; @OneToMany(mappedBy = "company", orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL) private List branchs = new ArrayList(); ... } @Entity public class Branch { ... private String branchName; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "companyId", foreignKey = @ForeignKey(.. 2021. 6. 13.