전체 글

Delivery

캐싱전략, 메모리

이번 글은 성능을 향상시키기 위해서 캐시를 사용할려는데 캐시사용에도 여러 전략이 존재합니다. 그래서 여러전략들을 정리하도록하겠습니다. 캐싱전략이란? 캐싱(Caching)은 애플리케이션의 처리 속도를 높여준다. 이미 가져온 데이터나 계산된 결과값의 복사본을 저장함으로써 처리 속도를 향상시키며, 이를 통해 향후 요청을 더 빠르게 처리할 수 있습니다 로컬 캐싱 vs 글로벌 캐싱 로컬 캐싱은 서버 내부 저장소에 캐시 데이터를 저장하는 것이다. 만약 scacle out을 한다면 데이터가 공유가 안되므로 서버마다 캐시 데이터가 다를수있습니다 그런데 서버내에서 작동하기 때문에 속도가 빠릅니다. 예를 들어, 사용자가 같은 리소스에 대한 요청을 반복해서 보내더라도 A 서버에서는 이전 데이터를, B 서버에서는 최신 데이터..

Delivery

레디스를 선택한 이유, 세션클러스터링

이번글은 저희가 대용량을 생각하면서 개발을 하자는 목적으로 Delivery프로젝트를 진행했습니다. 저희는 세션을 통한 로그인을 하는데 지금은 애플리케이션이 한개이지만 대용량 처리를 위해 scale-out을 통해서 여러개의 애플리케이션이 존재한다면 발생되는 문제점인 세션 정합성 문제를 해결하기 위한 세션 관리 전략에 대해 알아보겠습니다 정합성이란? 데이터 정합성 : 어떤 데이터들이 값이 서로 일치함. 왜 세션 정합성이 안맞는 문제가 발생할가? 아래와 같이 3대로 scale-out을 진행한다면 유저가 요청마다 Nginx가 요청을 분배해주는데 동일한곳으로 계속 연결을 시켜준다면 이상이없겠지만 요청마다 다른곳으로 요청을 분산시켜준다면 로그인을 했는데 또해야하는 문제가 발생하게될것입니다. 그래서 이러한 문제를 해..

Delivery

레디스에 대해 알아보자

이글의 목적은 Delivery 프로젝트에서 레디스를 활용하는 부분이 여러곳이 예상되어 생겼습니다. 그래서 저는 레디스를 사용하기 전 확실하게 다시 정리하기 적게되었습니다. 인메모리 데이터베이스란? In-Memory Database IMDB, 혹은 MMDB(Main Memory DBMS)라고 부르는 것을 알기위해선 메모리 계층을 알아야합니다. 인메모리란 컴퓨터의 메인 메모리 RAN에 데이터를 올려서 사용하는 방법을 말합니다. 사진과같이 위로갈수록 비싸고 속도가 더 빠릅니다. 왜 메모리에 데이터를 올려서 사용할가요? 바로 속도입니다. SSD,HDD와 같은 저장공간에서 데이터를 가져오는 것보단 RAM에 올려진 데이터를 가져오는데 걸리는 속도가 수백배 이상 빠릅니다. 그래서 빠른속도가 Redis의 장점입니다. ..

Delivery

Mybatis batch처리 성능과 트랜잭션

이번글은 제가 우선순위 업데이트를 구현하는 과정에서 발생한 문제를 해결하는 글입니다. 문제상황 우선순위 업데이트를 할때 update문이 여러번 실행되는것입니다. 우선순위를 바꿀때 하나의 로우에서 우선순위 컬럼이 2로 변경된다면 이에따른 메뉴들의 우선순위가 다같이 변경되어야한다고 생각해서 구현을 한 상황에서 db호출이 여러번 진행되므로 db호출을 할때 connection을 맺고 그리고 쿼리를 실행하는 과정이 반복되기때문에 느려진다고 판단했습니다. 프론트에서 받는데이터 [{id : 1, priority:3}, {id : 2, priority:1}, {id : 1, priority:4}, {id : 1, priority:5}] 프론트에서 저는 화면에 배치된 순서대로 받는다고 가정했습니다. 요구사항 하나의 co..

Delivery

테스트코드의 MockMvc utf-8 성능측정

안녕하세요, 이번 글은 저희가 CommonResult라는 공통포멧을 만들어서 Response로 반환하여 사용하는데, CommonResult의 필드에는 int(상태코드), String(메시지), T(데이터) 이렇게 사용을 하기로 팀원이 제안을 하였습니다. 그래서 Response로 CommonResult를 하는데 문제점이 json을 반환하기때문에 테스트코드에서는 jsonPath을 통해서 값을 확인하는데 바로 한글이 깨지는 문제가 생겼습니다. 이러한 한글깨짐 문제를 해결하는 방법은 2가지였습니다. @Before public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(wac) .addFilters(new CharacterEncodingFi..

Delivery

Mybatis ${}, #{} 차이

이글은 프로젝트에서 mybatis를 사용하는데 ${} 과 #{}차이점에 대해서 적었습니다 Statement와 Prepared Statement jdbc를사용할때 db connection에서 statement를 얻게되어서 이것을 통해 sql문을 실행시킨다 SQL문을 실행할 수 있는 객체 가장 큰 차이점은 캐시 사용 여부 SQL에서도 실행단계가있습니다. 1) 쿼리 문장 분석 2) 컴파일 3) 실행 📕Statement 쿼리문을 수행할 때마다 SQL 실행단계 1~3 단계를 거침 SQL 문을 수행하는 과정에서 매번 컴파일을 하기 때문에 성능상 이슈 발생 실행되는 SQL문을 확인 가능 📘Prepared Statement 컴파일이 미리 되어있기 때문에 Statement에 비해 좋은 성능 특수문자를 자동으로 파싱해주기..

Delivery

피드백 반영 리펙토링 후기

1. 주석처리된건 필요한게 아니라면 commit시에는 삭제하도록하자. 2. Rest ful한 설계를 위해서 signup은 예외적인줄 알았지만 users라는 Post요청으로는 회원가입말고는 없기때문에 POST : /users 로 수정 3. @AllArgsConstructor 모든 필드가 사용된다면 어노테이션을 통해 코드를 줄이자 리펙토링시에 잘 확인하자 추가적으로 롬복이 제공하는 어노테이션을 잘 확인하도록 하자 https://dingue.tistory.com/14 4. @NoArgsConstructor 를 왜 사용했는가? 사용하면서 json에서 이제 post요청시에 dto를 json에서 자바코드로 역직렬화 시에 오류가 생겨서 사용했습니다. 해결하는 방법이 우연히 Noargs가 습관적으로 사용해서 해결이되었..

Delivery - WIL

회원가입, 로그인 기능 구현 끝나고.. - 기능구현 1주차

회원가입과 로그인기능을 구현한 후 PR를 날린후 멘토님께 코드에대해 설명하면서 리뷰를 받았습니다. 더 정확한 리뷰는 PR에 남겨주신다고했습니다. 느낀점 🔨TDD 중요성 회원가입과 로그인 부분작성하는데 의외로 오래걸렸습니다 더 디테일하게 작성하고싶었지만 저희가 만드는 프로젝트는 유저를 가정했기때문에 Valid부분에서는 약간의 헛점이 보이기도했습니다. 이러한 헛점을 찾아낸것은 바로 테스트코드였습니다. 저는 이번프로젝트에서 가장큰 목표를 테스트코드를 작성하는 습관과 작성을 잘하고싶었습니다. 멘토링하기전까지의 저는 코드작성을하고 기능을 테스트하는것을 end to end test로 사용자의 입장으로 Postman을 직접 URI를 호출함으로써 작동을 확인했습니다. 그런데 이러한 것을 테스트코드를 작성해서 테스트하다..

Delivery

코드리팩토링 - (CheckStyle, AccessLevel, Builder, final)

빌더패턴 글을 쓰기위해 다른분들의 글을 읽으면서 AccessLevel 이라는 키워드를 발견하게되었고 이와 빌더와의 관계를 공부하며 또한 빌더패턴을 사용했지만 정확하게 사용한방법을 알아본 결과를 코드로 리펙토링하게되었습니다. 추가적으로 팀원과의 협업작업중이므로 Checkstyle도 다운받아서 고치게되었습니다. 체크스타일이란? 체크스타일은 코드를 작성할 때 일반적으로 지켜야 하는 코딩 표준을 잘 준수할 수 있도록 지원하는 유틸입니다. 대표적인 예로 카멜케이스 규칙을 들수 있습니다. 자바 코드를 작성할 때 변수명은 카멜케이스를 지키는 것을 원칙으로 하지만 실제로 이 규칙을 어겨도 컴파일 오류가 발생하지는 않습니다. 이 클립스와 같은 개발 툴에서 이 규칙을 잘 지키고 있는지 별도의 알림을 주지 않으며 이것을 확..

Delivery

Home-Delivery 개념 모델링

home-delivery 프로젝트를 시작하게되었다. 이전까지는 프로토타이핑과 기능정의를 했다. 개념모델링을하던중 고민사항을 글에 적었습니다. home-delivery는 배달클론코딩 프로젝트입니다. 그래서 많은 앱들을 관찰을 하였습니다. 그러던중 배달의민족앱은 장바구니에 담아야 주문을 할수있도록 기능이 설계되어있습니다. 장바구니 기능이 존재하는 다른 이커머스 앱이나 웹을보면은 장바구니에 담지않고 바로 구입을 가능하도록 설계되어있습니다. 그래서 고민이있었습니다. 장바구니를 관계를 두어야하는지 아니면 개체로 생각하고 모델링해야하는지 고민했습니다. 직접 관계로 생각하고 해보니 모델링이 관계와 관계끼리 연결이되는 문제가 생겼습니다. 그로그인해 장바구니를 하나의 개체로 생각하였고, 설계한결과 더 깔끔한 모델링이 되..

cwangg897
wang's tech blog