스터디/이펙티브코틀린

아이템 1 - 가변성을 제한하라

어떠한 요소가 상태를 갖는 경우, 요소의 동작은 사용 방법뿐만 아니라 그 이력에도 의존하게된다. 상태를 갖게 하는 것은 양날의 검이다. 변하는 요소를 표현할 수 있다는 것은 유용하지만, 상태를 적절하게 관리하기 어렵기 때문이다. 이해하고 디버그하기 힘들어진다. 코드의 실행을 추론하기 어려워진다. 멀티스레드 프로그램일 때 동기화가 필요하다. 테스트하기 어렵다. 변경을 다른 부분에 알려야 하는 경우 불편하다. set, map의 key로 사용할 수 없다. hash 값이 변경되면 요소를 버킷에서 찾지 못할 수 있다. 코틀린에서 가변성 제한하기 코틀린은 가변성을 제한할 수 있게 설계되어 있습니다. val → 읽기전용 프로퍼티 가변(mutable) 컬렉션, 읽기전용(immutable) 컬렉션의 구분 데이터 클래스의..

2022.02.25 게시됨

스터디/JPA

AttributeConverter를 이용하여 비정형 데이터 저장하기

들어가며 이번 포스트에서는 Spring Data JPA를 사용하고 관계형 데이터베이스를 사용하는 환경에서 AttributeConverter를 이용하여 비정형 데이터를 저장하는 방법과 주의점에 대해 살펴보고자 한다. 관계형 데이터베이스에서 비정형 데이터를 저장할 일이 있는가? 할 수 있지만 화면에 뿌려줘야하는 view 성격의 데이터 혹은 구조의 변경이 잦은 데이터라면 사용하게되는 경우가 생긴다. MySQL과 같은 관계형 데이터 베이스는 각각의 column에 개별 데이터를 저장하는 방식으로 사용된다. 그러다 보니 비정형의 데이터를 저장할 때 하나의 column에 VARCHAR 형식으로 하나의 String 처럼 저장하여 사용해야한다. 사용법 이 예제에서는 편지를 나타내는 Letter 와 @Entity @Tab..

2022.02.23 게시됨

생각/회고

2022년 1월 회고

들어가며 2021년을 회고하며 2022년부터 한 달에 한번 회고를 하기로 했다. 내가 성장하기 위해서는 나를 잘 알아야 하는 메타인지가 중요하고, 메타인지를 위해 짧은 주기의 회고를 선택했다. 내가 설정한 목표 2022년에 이루고자 하는 목표를 살펴보며 1월 회고를 진행해보겠다. 현재 내가 속한 회사 역량레벨의 항목을 전부 만족하기 한달에 한편 이상의 기술 블로그 글 작성하기 한달에 한권 이상의 기술 서적을 읽기 한달 회고 작성하기 현재 내가 속한 회사 역량레벨의 항목을 전부 만족하기 회사에서 정한 역량 레벨의 목표 중 하나가 성장경로의 이정표이다. 다시 말해 내가 어떤 역할을 해야 하는지 가이드 역할을 해주기 위해 존재한다는 것이다. 이러한 지표가 존재한다는 것은 내가 어떠한 역할을 할 수 있는지 파악..

2022.01.31 게시됨

스터디/클린코드

소프트웨어 악취 - 명령 추상화

소프트웨어 악취를 제거하는 리펙토링을 읽고 내용을 재정리하였다. 명령 추상화로 인한 악취 연산 프로세스를 클래스로 표현하는 경우 발생한다. 연산 클래스라고 부르기도 한다. 문제는 클래스 내부에 연산 프로세스를 나타내는 메서드가 단 하나만 존재할 때 발생한다. 보통 다른 메서드의 내부 도우미 메서드로 사용된다. 다시 말해 클래스 내부에서 메서드로 존재해야 하는 연산이 클래스 자체로 표현된 것이다. 특정 개념의 추상화를 표현한 클래스는 데이터와 함께 관련된 메서드를 캡슐화 해야 하는데 그렇지 않을 때 발생한다. 이로 인해 추상화는 설계의 복잡성이 늘어나고 동일 데이터에 대해 동작하는 메서드가 여러 곳에 분리되어 응집성이 줄어들게 된다. 때로는 연산을 객체로 격상시키는 편이 나을 때도 있다. 원인 보통 객체지..

2022.01.06 게시됨

생각/회고

1년차 개발자 회고

2021년 1년차 개발자 회고 2022년의 첫날 드디어 첫 회사에서의 회고를 작성한다. 2021년 여러 일이 있었고 아래 이야기를 해보고자 한다. 1일 1커밋 중단 AWS 게임데이 참여 시니어 개발자의 퇴사(은퇴) 수습해제 고객향 워크로드 개발 성장에 대한 고민 1일 1커밋 중단 약 2년간의 1일 1커밋을 중단했다. (사실 1일 1커밋이라고 하기앤 중간 중간 이빨이 빠진 부분이 있어서 애매하다.) 먼저 '1일 1커밋을 왜 했는가?' 라고 물어본다면 여러가지 대답이 나올 수 있다. 첫번째, 취업 준비중인 아들이 걱정되는 부모님께는 아들이 어떤 노력을 하고 있는지 보여드릴수 있는 증거가 되었다. 실제로 내가 우아한 테크코스에 지원을 할것이라고 부모님께 알려(통보)드리고 교육기간이 1년정도 걸릴 것이라고 말씀..

2022.01.01 게시됨

스터디/클린코드

Gradle TestFixtures 이용하여 테스트 코드 중복 줄이기

Gradle Test Fixture 사용해서 테스트 중복코드 줄이기 Gradle Test Fixture 테스트코드를 작성하다보면 테스트 코드에서도 중복된 코드가 굉장히 많이 발생하게 된다. 대표적인 예로 특정 도메인 객체를 생성해야하는 작업이다. 이러한 코드가 작성하기 어렵지는 않지만 그 양이 적지 않아서 테스트 코드를 작성할 때 시간을 잡아먹는 부분이기도 한다. Gradle 에서 제공하는 Test Fixture 기능을 이용하면 이를 쉽게 해결할 수 있다. 코틀린의 경우 gradle 문법만 달라져서 적용하는데 큰 문제 없었다. 예제코드는 Github 에서 확인할 수 있다. 문제 상황 테스트를 위해 간단하게 2개의 모듈을 가진 멀티모듈 구조를 만들었다. application 모듈이 core 모듈 의존성을 ..

2021.10.11 게시됨

스터디/Kotlin

Resilience4j CircuitBreaker 사용하기

들어가며 Resilience4j는 넷플릭스의 히스트릭스에 영감을 받아 개발된 경량화 Fault Tolerance 라이브러리이다. 그 중 Circuit Breaker(이하 서킷브레이커)를 분석하고 적용하였다. 서킷브레이커의 상태 서킷 브레이커는 유한한 개수의 상태를 가질 수 있는 장치인 FSM(finite state machine)으로 세가지 일반적인 상태와 세가지 특수 상태로 나뉜다. 일반적인 상태는 다음과 같다. CLOSED : 서킷브레이커가 닫혀 있는 상태로 서킷브레이커가 감싼 내부의 프로세스로 요청을 보내고 응답을 받을 수 있다. OPEN : 서킷브레이커가 열려 있는 상태로 서킷브레이커는 내부의 프로세스로 요청을 보내지 않는다. HALF_OPEN : 서킷브레이커가 열려 있는 상태지만 내부의 프로세스..

2021.09.26 게시됨

스터디/네트워크

파일 해시와 체크섬을 이용하여 파일 무결성 확인하기

파일 해시와 체크섬 팀에서 사용하고 있으니 조금 더 이해가 필요하다고 판단했다. 일단 필요한 지식에 대해서 간단하게 컨셉정도만 이해하도록 하자. 해시 해시는 간단하게 해시 알고리즘(Hash Algorithm)을 통해 계산해서 생성된 값을 의미한다. 해시 함수에 원본 값이 다름에도 해시된 결과 값이 충돌 될 수도 있기 때문에 해싱하는데에 유의를 해야한다. 대표적으로 MD5, SHA 계열의 함수가 있다. 체크섬 체크섬은 오류 검출을 위한 기법으로 통신으로 주고받는 데이터의 신뢰성을 보장하기 위한 방법이다. TCP 세그먼트에는 IP헤더, 체크섬, 송수신지 주소등의 정보가 있는데 TCP 세그먼트의 값들중 체크섬을 제외한 모두 더한다음 그 결과과 세그먼트의 체크섬 값과 일치하는지 확인한는 방식을 말한다. 적용 사..

2021.09.22 게시됨

생각/회고

AWS Game Day 회고

AWS Game Day! 이벤트가 끝나고 며칠이 지난 뒤 쓰는 회고라 몇몇 부분은 기억이 잘 기억이 나지않아 글이 매끄럽지 않습니다. ㅎㅎ 어떻게 참여하게 되었는가? 회사내에서 Game Day 참가자 모집을 하고 있었고, 입사 동기들과 이야기를 하다가 인프라팀에 속해있는 동기가 같이 참가할 사람을 구하기 시작했습니다. 백엔드 개발자로 일을 하면서 어플리케이션 레벨의 코드를 작성하는 것은 큰 어려움 없이 학습하고 조금씩 자신감이 붙고 있지만, 인프라 요소에 대해서는 잘 알지도 못할뿐더러 학습도 제대로 하지 않고 있었습니다. 또 이전에 타 팀분들이 Auto Scailing Group 변경에 대해 검토와 요청을 하셨는데 어떻게 해야 하는지 몰라서 당황했던 적이 있었는데 선배 개발자분이 해결해주셨었습니다. 이때..

2021.06.07 게시됨

스터디/인프라

LocalStack으로 AWS 로컬 환경 구축하기

목적 Docker와 LocalStack, AWS CLI을 이용해서 AWS SQS를 구축해보자. 환경 Docker Engine : 19.03.8 compose : 1.25.4 Mac os docker-compose.yml version: "3" services: localstack: container_name: localstack image: localstack/localstack:0.12.11 ports: - "4566-4576:4566-4576" environment: - SERVICES=sqs - DEFAULT_REGION=${DEFAULT_REGION- } - DEBUG=0 - DOCKER_HOST=unix:///var/run/docker.sock - "/var/run/docker.sock:/var..

2021.05.30 게시됨