분류 전체보기
-
테스트 코드 수행 시간 개선하기Diary/우아한테크코스 2022. 10. 26. 10:57
속닥속닥 프로젝트에서는 현재 425개의 테스트가 작성되어 있다. 프로젝트 중반이 넘어가기 전쯤에 DirtiesContext를 덜어내고 EntityManager를 통해 테스트 격리를 해 시간이 굉장히 오래 걸리진 않았지만, 그래도 테스트 코드 작성이 늘어가면서 시간이 늘어나는 것이 보였고 개선할수 있는것은 최대한 개선해보아야 겠다는 생각을 했다. Context Caching 테스트에서 ApplicationContext 가 한번 로드되면, 같은 test suite 에서는 동일한 unique context 설정일 때 후에 진행되는 테스트들에 대해서 context를 재사용한다. ApplicationContext는 configuration 파라미터들의 조합에 의해 유니크함이 판별된다. 즉, 유니크한 cofigur..
-
MySQL DB Replication 이론편카테고리 없음 2022. 10. 24. 22:29
Replication 이란? 한 DB서버에서 다른 DB서버로 데이터가 동기화되는 것 원본 데이터를 가진 DB서버를 Source 서버, 복제된 데이터를 가지는 DB서버를 Replica 서버라고 한다. Replication 을 왜 해야할까 Scale Out 사용자가 늘어나다 보면 서버의 트래픽이 증가한다. 속닥속닥의 경우 WAS를 이중화하여 nginx 를 통해 로드밸런싱을 하고 있다. 그런데, WAS는 로드밸런싱을 해 부하가 분산되지만 DB 서버는 두 WAS 모두의 요청을 받으면서 결국 WAS가 한개일때와 같은 부하를 받게 된다. 결국 DB서버 또한 트래픽을 분산시켜주어 서버에 과부하가 걸리지 않도록 해야한다. DB Replication을 통해 DB서버를 다중화해 트래픽을 분산할 수 있다. 백업 DB 서버에..
-
좋아요 개수 조회 최적화하기Diary/우아한테크코스 2022. 10. 18. 17:33
우아한테크코스 4기 토르와 같이 테코블에 작성한 글입니다. https://tecoble.techcourse.co.kr/post/2022-10-10-like-count/ 속닥속닥 프로젝트(https://github.com/woowacourse-teams/2022-sokdak)를 진행하면서 현재는 문제가 되지 않지만 시간이 갈수록 데이터가 쌓이면서 문제가 될 수도 있겠다라고 생각한 부분이 있습니다. 게시글에 대한 '좋아요' 기능인데요, 현재 구조에서는 게시글을 조회할 때, '좋아요' 테이블과 함께 조인을 해서 가져오고 있습니다. 단순히 좋아요 개수만 저장하지 않는 이유는, 한번 좋아요 버튼을 누른 사람은 두 번째 누를 때 취소할 수 있어야 하기 때문입니다. 하지만 이런 방식이라면 만약 게시글 하나에 좋아요가..
-
무중단 배포 적용기Diary/우아한테크코스 2022. 10. 17. 22:38
우아한테크코스 최종 데모데이의 요구사항으로 무중단 배포가 있다. 이를 학습하고 적용한 내용을 정리한다. 무중단 배포는 왜 필요할까? 스프린트4 때쯤, 기능을 개발하고 팀원들끼리 QA를 한 후에 운영서버에 배포를 하고 있었다. 그런데, 그 찰나의 순간에 우리 속닥속닥 서비스를 이용하고 있던 다른팀 크루가 속닥속닥 왜 안되냐는 말을 했다. 우리 서비스의 경우 사용자가 많지 않고, 잠깐 서비스가 중단된다 해서 금전적인 손해가 발생하지는 않기 때문에 큰 문제는 없다. 그런데, 서비스가 잠깐이라도 중단되면 안되는 서비스라면 어떨까? 특히, 금전적인 문제가 달려있다면? 새로운 기능을 배포하거나 버그 픽스는 위험을 감수해가며 배포 할 것이지만, 리팩터링에 대한 배포는 쉽지 않을 것이다. 무중단 배포 3가지 방법 Ro..
-
대댓글 기능 구현하기Diary/우아한테크코스 2022. 10. 4. 22:06
속닥속닥 프로젝트는 댓글 기능이 존재하는 상황이었다. 그런데 운영중 사용자들의 피드백으로 대댓글 기능을 도입해달라는 피드백이 많았고, 우리 팀 또한 대댓글을 도입하면 재미있을 거라고 생각해 기능 개발을 하게 되었다! 요구 사항은 다음과 같다. 댓글에 대댓글을 작성할 수 있다. 댓글이 삭제 되더라도 대댓글은 남아 있어야 한다. 댓글이 삭제된 상태에서, 그 댓글에 달린 대댓글이 모두 삭제되면 댓글 또한 완전히 삭제되어야 한다. 익명으로 작성하는 댓글의 경우 임의의 닉네임(ex: 짜증나는 리액트)으로 보여주고, 한 번 댓글을 작성해 익명 닉네임을 할당 받은 경우 한 게시글에서는 같은 익명 닉네임을 사용하게 되는데, 이를 대댓글에도 적용한다. 먼저, 대댓글 객체 설계에 대한 고민부터 시작했다. 댓글 객체의 필드..
-
findBy*** VS findBy***Id카테고리 없음 2022. 10. 4. 21:44
속닥속닥 프로젝트에서는 Spring Data Jpa 를 사용하고 있다. 추상화된 api 를 쓰다 보니, 예상치 못한 부분에서 성능 이슈가 발생하기도 하는데, 이번에 댓글 기능 리팩터링을 하며 겪은 문제를 써보고자 한다. 문제 상황 속닥속닥에는 댓글 기능이 있는데, 게시글 하나에 댓글 여러개가 속할 수 있기 때문에 Many To One 으로 연관관계를 맺고 있다. 다시 말해, Comment 테이블에서 post_id 를 가지고 있는 것이다. 이 상황에서 CommentRepository 에서 findAllByPostId 메서드를 호출하면, 당연히 아래와 같은 쿼리가 나갈줄 알았다. select * from comment as c where c.post_id = ? 그런데... 실제로 실행을 해보고 나니 아래와..
-
[Spring] 이미지 서버 구현하기 (1)카테고리 없음 2022. 9. 26. 03:39
속닥속닥 을 운영하면서 게시물에 사진을 올리는 기능이 있으면 좋겠다는 피드백을 많이 받았다. 만들어야지 만들어야지 했는데, 다른 태스크로 인해 우선순위가 뒤로 밀려있다가 드디어 만들게 되었다! S3를 사용했다면 더 간단하게 구현했을테지만, S3의 사용이 제한되어 있었기 때문에 정적 리소스를 반환하는 이미지 서버를 직접 구축하게 되었다. 간단히 구현 사항을 요약해 보자면 이미지 업로드 API를 통해 이미지를 저장한다. 이미지 네임을 기반으로 조회 요청을 받으면 해당 정적 이미지 파일을 돌려준다. 추상화시킨 구현 내용을 보면 굉장히 간단하다! 차근차근 구현해보자 이미지 업로드 먼저, 이미지를 저장하는 것부터 구현한다. 클라이언트가 서버에게 이미지를 보낼때는 데이터가 크거나, 이미지에 대한 설명을 같이 보낼..
-
AOP 용어 정리Programming/Spring 2022. 9. 19. 21:28
AOP 용어 정리 이 용어들은 Spring AOP에 국한되지 않음 Aspect 여러 클래스를 횡단하는 관심사를 모듈화한 것. 스프링 AOP에서 Aspect는 일반적인 클래스에 @Aspect 를 통해 구현된다. Join point Advice가 적용될 수 있는 위치, 프로그램 실행 동안의 한 지점을 뜻한다. 예를들어, 메서드의 실행이나 예외 핸들링 같은 부분이다. Spring AOP에서 Join point는 항상 메서드의 실행을 나타낸다. Target object에서 구현한 인터페이스의 모든 메서드는 Join point가 된다. Advice 특정한 Join point 에서 Aspect에 의해 취해지는 행동을 뜻한다. 즉, 타깃에게 제공할 부가기능을 담은 모듈이다. 다양한 advice 타입이 있는데, 핵심적..