date_range 01/07/2021 00:00
개요
최근 스마트스토어 프로젝트를 진행하면서 기능추가 시에 반복적으로 수행해야 하는 작업들이 있었습니다. 개발한 기능을 서버에 배포하기 전에 빌드하고 테스트를 해야했고, 동료 개발자가 개발한 기능을 확인하려면 해당 branch를 clone을 받아서 local에서 실행-테스트 해보곤 했습니다. 이런 작업들은 손이 많이 가고 반복적이었지만 생략할 수 없는중요한 작업들이었습니다.이런 불편함을 느끼던 중에 CI/CD라는 개념을 알게 됐고, 저에게 절실히 필요하다고 느껴졌기에 공부하고 적용해보기로 했습니다.
date_range 08/06/2021 23:31
이번 글에서는 스마트스토어 프로젝트 중에 MySQL Replication을 적용한 경험에 대해서 적어보고자 합니다.
date_range 28/04/2021 00:00
잭슨은 json데이터와 java object 간에 직렬화/역직렬화 기능을 제공하는 강력하고 편리한 라이브러리이다.
잭슨을 통해 다형성이면서(polymorphic) 여러 하위구조를 갖는 자바 객체도 손쉽게 json 포맷으로 데이터 바인딩할 수 있다.
이 작업을 하려면 직렬화를 수행할 때 필요한 정보를 잭슨에게 넘겨주어야 한다. 그래야 역직렬화 시 데이터를 복원할 때
정확한 하위클래스 타입으로 복원할 수 있다.
본격적 내용으로 들어가기 전에, 직렬화와 역직렬화에 대해서 간단하게 짚고 넘어가도록 하자.
먼저 직렬화는
직렬화 또는 시리얼라이제이션은 컴퓨터 과학의 데이터 스토리지 문맥에서 데이터 구조나 오브젝트 상태를 동일하거나<br>
다른 컴퓨터 환경에 저장하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이다. <br>
오브젝트를 직렬화하는 과정은 오브젝트를 마샬링한다고도 한다.
date_range 13/04/2021 00:00
스프링 어플리케이션이 실행되는 시점에 여러가지 설정정보를 읽어와서 부트스트랩(bootstrap)한다는 것은 알고 있었다. XML파일의 어딘가에 선언해두면 스프링이 오브젝트 생성을 하고,, 의존관계를 형성해서 주입하고 등등의 두루뭉술한 설명이 가능했다. 하지만 이정도 이해로는 많은 부족함이 있기 때문에, 이 부분에 대한 궁금증을 이 글을 통해서 정리하면서 해소해보고자 한다.
이 글은 스프링의 bootstrap과정을 모두 설명하는 것이 아니라, 스프링을 통해 Resource 오브젝트와 그것을 로드하는 Resource Loader을 설명하는 글이다.
Resource는 문자열 안에 리소스의 종류와 리소스의 위치를 함께 표현하게 해준다. 그리고 이렇게 문자열로 정의된 리소스는 Resource Loader를 통해 실제 Resource 타입 오브젝트로 변환된다.
리소스 로더가 처리하는 대표적 접두어들은 다음과 같다.
date_range 12/04/2021 00:00
회사에서 종종 보이는 예외중의 하나가 동시성 관련 ConcurrentModificationException
예외였다.
이 예외는 어떤 쓰레드가 Iterator를 통해 순회 중인 Collection을 수정하는 경우 발생한다.
내가 본 경우는 DB에서 가져와서 List에 저장된 데이터를 순회하는 중 동시에 수정작업을 하려는 로직이었던 것으로 기억한다.
동시성 관련 예외는 멀티 스레드 환경에서 서로 다른 스레드가 같은 객체에 접근하여 데이터를 조작할 때에 발생한다. 아까 말한 List인 ArrayList의 경우 thread-safe하지 않기 때문에 동시성 이슈에서 자유로울 수 없었던 것이다. 하지만 이 글에서는 ArrayList의 동시성 이슈가 아닌 ConcurrentHashMap이 멀티 스레드 환경에서 동시성 이슈를 어떻게 다루는 지에 대해 알아볼 것이다.
ConcurrentHashMap
은 어떻게 thread-safe할 수 있는 걸까?
자바에서 제공하는 HashMap
과 Hashtable
은 Map인터페이스를 상속받아 구현되어 데이터를 키와 값으로 관리하는 자료구조이다.
이 둘의 차이점으로 동기화(Synchronization)를 들 수 있다. HashMap
의 경우 동기화를 지원하지 않는반면 다중 스레드 환경에서 Hashtable
은 동기화를 지원하기 때문에 실행 환경에 따라 구분하여 사용하면 된다.
동기화를 지원한다는 것은 스레드의 접근을 제한하여 단일 스레드만 순차적으로 접근할 수 있게 한다는 의미이다. 이것은 스레드의 병목을 유발하여 성능저하의 영향을 미칠 수 있다.
동기화를 지원함으로 속도적인 측면에서 구형이라 할 수 있는 Hashtable
은 동기화 처리라는 비용때문에 HashMap
에 비해 더 느리다고 한다.
따라서 읽기가 많은 환경이라면 HashMap
을 사용하는 것이 현명한 선택이라고 생각한다.
이제 이 글의 주제인 concurrentHashMap
에 대해서 알아보자. concurrentHashMap
은 동시적이고 멀티스레드한 환경에서 기존의 hashmap
보다 더 나은 성능을 위해서 만들어졌다. concurrenthashmap
은 동시성을 해결하기 위해 hashtable
처럼 테이블 전체에 대해서 synchronize를 걸지 않는다. hashtable
은 단일 스레드가 작업을 완료하는동안 전체 테이블에 락이 걸리게 되므로 성능적으로 손해를 본다.
date_range 20/03/2021 00:00
스마트스토어 프로젝트를 진행하면서 만약 내 서비스가 성공을 거두어서 동시 이용자수가 기하급수적으로 증가한다면 어떻게 될까? 라는 고민을 갖게 됐습니다. 정말 그런 일이 일어난다면 현재 개발환경(서버 1대)로 운영이 불가능할 것입니다. 그리고 서버가 터지면 아무도 사용자가 떠날 것입니다. 이런 문제들을 어떻게 해결할 수 있을 지 고민해 보고 정리했습니다.
서버의 가용한 컴퓨팅 자원이 부족한 상황이 온다면 고려해야 할 것은 서버의 확장(Server Scaling
)입니다.
date_range 03/02/2021 00:00
JIT는 JVM내부에서 바이트코드를 기계어로 변환하는 방식으로서 Just-In-Time의 약자다.
date_range 16/01/2021 00:00
사실 HotSpot이라는 단어를 들었을 때 가장 먼저 떠오른 의미는
핫스팟 또는 핫스폿(영어: hotspot)은 스마트폰, 노트북을 포함한 이동 단말기로 라우터 등 무선 액세스 포인트가 설치된 지역에서 무선 네트워크(WLAN)에 접속하여 초고속 인터넷과 각종 콘텐츠를 이용할 수 있게 하는 서비스
date_range 13/05/2020 00:00
객체를 비교하는 데 없어서는 안될 메소드인 equals와 hashcode.
이 두 메소드의 관계는 무엇일까? 이것에 대해 알아보도록 하자.
간략하게 한마디로 정리해 보자면 다음과 같다.
equals는 현재 객체와 넘겨진 객체를 비교한다.
hashcode는 한 고유한 객체의 고유한 정수인 해시코드 값을 반환한다.
date_range 14/02/2020 00:00
데코레이터 패턴이 원본에 장식을 더하는 패턴이라는 것이 이름에 잘 드러나 있다.
데코레이터 패턴은 프록시 패턴과 구현 방법이 같다. 다만 프록시 패턴은 클라이언트가 최종적으로 돌려받는 반환값을 조작하지 않고 그대로 전달하는 반면 데코레이터 패턴은 클라이언트가 받는 반환값에 장식을 덧입힌다.