전체 글
[Spring] 서버 스펙에 따른 쓰레드 수 조정
[Spring] 서버 스펙에 따른 쓰레드 수 조정
2025.08.11최근 프로젝트를 하고 GCP(Google Cloud Platform)에 배포하여 운영 서버를 가동시켰다. 비용문제로 인해 낮은 스펙을 사용할 수 밖에 없었지만 아직 테스트 사용자만 있는 지금 상황에서는 충분한 스펙이라고 생각한다.하지만 그럼에도 만족하지 못할 성능이 나오는 경우가 있다.이번에는 이를 위해 서버 스펙에 맞춰 스레스 수를 조정한 과정을 공유하고자 한다. 그럼 스펙이 낮은 서버를 가동했을 때 Spring에서 고려해봐야 하는 것이 무엇일까? 톰캣 스레드먼저 우리가 Spring 서버를 배포 할 때는 보통 Tomcat이라는 WAS를 통해 배포하게 된다. Spring은 외부에 Tomcat을 가동한 상태에서 배포할 수도 있고, Spring Boot 내부에 내장되어 있는 Tomcat을 사용해서 배포할 ..
[Spring] 좋아요 기능에 대한 동시성 문제
[Spring] 좋아요 기능에 대한 동시성 문제
2025.08.03현재 진행하는 프로젝트에서 뉴스피드의 좋아요 기능에 대한 동시성 문제 해결 과정을 공유하고자 한다. 현재 프로젝트의 좋아요 기능현재 프로젝트의 좋아요 기능은 여타의 서비스들의 좋아요 기능(유튜브, 인스타그램 등)과 유사하다. 여기서 유사하다는 의미는, 좋아요 버튼을 토글 방식(한 버튼을 통해 좋아요와 좋아요 취소를 하는 것)으로 구현한 점이 비슷하다는 것을 의미한다.즉, 좋아요를 안한 상태에서는 좋아요 버튼으로 활성화되고 좋아요를 한 상태에서는 좋아요 취소 버튼으로 활성화되는 것이다. 이렇게 구현하다보니 작은 이슈들이 생겼는데, 이제부터 그 내용을 얘기하고자 한다.(물론 이 방식이 아니라 다른 방식으로 구현해도 생길 수 있는 이슈들이다) 좋아요 중복 클릭 문제(feat. 좋아요 레코드 중복 삽입)흔히 따..
[OS] 컴퓨터는 현재시간을 어떻게 알까?
[OS] 컴퓨터는 현재시간을 어떻게 알까?
2024.07.31컴퓨터의 시계를 보면 꽤 정확하게 시간을 측정하는 시계를 볼 수 있다.그런데 컴퓨터는 이 시간을 어떻게 매번 정확하게 측정할 수 있는걸까? 이를 알기 전에 고등학교 물리 시간으로 돌아가 시간 측정 방법에 대해서 먼저 알아보자. 협정 시계시(UTC)협정 시계시는 국제적인 표준 시간의 기준으로 쓰이는 시각으로, 원자시계와 윤초 보정을 기반으로 표준화 한 시각이다.이 시각은 학교에서 배웠듯이 영국 그리니치 천문대가 기준(UTC+0)이다. 대한민국의 시간은 UTC+9로, 영국이 12시라면 한국은 21시가 된다. 원자시계협정 시계시는 위에서 말했듯, 원자시계를 통해 측정한다.원자시계는 세슘 원자를 이용해 정의하며, 세슘 원자가 절대영도 조건에서 방출하는 특정한 파장의 빛이 9,192,631,770번 진동하는 시..
[Docker] docker의 용량을 차지하는 overlay2는 무엇일까?
[Docker] docker의 용량을 차지하는 overlay2는 무엇일까?
2024.07.28이전에 overlay2에 용량이 가득 차 배포를 실패하는 상황이 발생하여 해결한 적이 있었다. 그런데 이 overlay2라는게 과연 무엇일까? OverlayFS먼저 overlay2를 알기 위해선 OverlayFS를 알 필요가 있다.OverlayFS는 유니온 마운트 파일 시스템으로, 이를 통해 사용자는 한 파일 시스템을 다른 파일 시스템 위에 오버레이(overlay)할 수 있다. (이외에도 AUFS, Devicemapper가 있다)OverlayFS는 overlay 또는 overlay2 중 하나를 사용한다. overlay는 커널 3.18 버전부터 기본적으로 내장되어 있으며, overlay2는 4.0부터 지원된다.Docker를 설치하면 자동으로 사용되도록 설정되며 최신 버전의 Docker는 기본적으로 Ove..
[Docker] 디스크 용량으로 인한 배포 실패 상황
[Docker] 디스크 용량으로 인한 배포 실패 상황
2024.07.27CodeDeploy를 통해 개발 서버에 배포 하던 중 배포가 실패된 상황이 발생했다. No space left on device맞다. 서버에 남은 공간이 없다는 말이다.비용적인 문제로 인해 개발서버를 t2.micro에 띄워 배포하고 있었는데, 프리티어의 경우 storage volumn이 최대 30GB까지만 허용되기 때문에 30GB를 다 사용했다는 말이었다. 그런데, 여태 코드 몇 줄 추가 했다고 30GB가 전부 채워질리는 없었다. 그럼 먼저 용량을 한번 확인해보자.$ sudo df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 4.0M 0 4.0M 0% /devtmpfs 475M 0 475M ..
[Java] System.out.println의 사용을 지양하자
[Java] System.out.println의 사용을 지양하자
2024.06.21개발자는 프로젝트를 진행하면서 요청을 기록 및 관찰하기 위해 logging을 한다. 아마 초반에 토이 프로젝트를 하다보면 요청이 잘 갔는지 확인해보기 위해 System.out.println을 사용하는 경우가 많을 것이다. 이번에 말할 주제는 제목과 같이 System.out.println의 사용을 지양해야 한다는 것이다. 왜 그래야하는지 한 번 살펴보자. logging framework만약 자바/스프링부트 기반의 프로젝트를 진행해봤다면, 스프링부트 프로젝트 생성 시 로깅 프레임워크들(log4j2, logback 등)이 추가되는 것을 볼 수 있다. 이 로깅 프레임워크들을 이용해서 다음과 같이 logging을 할 수 있다.class App { public static void main(String[] ..
[Java] 위도/경도 값에 BigDecimal or double?
[Java] 위도/경도 값에 BigDecimal or double?
2024.04.30위/경도 값을 저장할 때 BigDecimal을 사용하는 것을 본 적이 있다.하지만 BigDecimal을 사용하는 것이 좋은걸까? double을 사용하는 건 좋지 않은 걸까?BigDecimal과 double에 어떤 특징이 있는지, 위경도에 어느 자료형이 적합할지 한 번 살펴보자. double의 부동소수점 문제오늘날 컴퓨터는 대부분 IEEE 754 부동 소수점 방식을 사용하기 때문에 Java에서 double을 사용해 소수를 표현한다면 소수점 약 15자리부터 오차가 발생할 수 있다. 오차를 해결하려면?Java에는 BigDecimal이라는 자료형으로 부동소수점 방식으로 인해 생기는 오차를 막을 수 있다. https://docs.oracle.com/javase/8/docs/api/java/math/BigDec..
[Java] utility class는 무엇으로 구현하는 것이 좋을까?
[Java] utility class는 무엇으로 구현하는 것이 좋을까?
2024.04.15Utility class? utility class(유틸리티 클래스)는 애플리케이션 전체에서 활용할 수 있는 클래스로 정적 메소드(static method)를 통해 구현한다. Interface의 static method 사용? Java 8 이후로, interface에 static method를 사용할 수 있게 되었다. 만약 static method를 사용하여 유틸리티 클래스를 구현한다면 다음과 같이 작성할 수 있다. public interface CalculatorUtils { static int getSumResult(int a, int b) { return a + b; } } 인터페이스로 구현하니 간결하고 실용적이게 보인다. 하지만 인터페이스로 유틸리티 클래스를 구현하는 데에는 몇 가지 단점이 있다...
[Java] 제네릭(Generic)
[Java] 제네릭(Generic)
2024.03.12제네릭(Generic)? 제네릭은 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능이다. 객채 타입을 컴파일 타임에 체크하기 때문에 잘못된 형변환으로 인해 오류가 발생하는 상황을 막아주고, 형변환의 번거로움이 줄어들 수 있다. 제네릭 클래스 제네릭은 클래스와 메서드에 사용할 수 있는데, 먼저 제네릭 클래스는 클래스 명옆에 와 같이 타입 변수를 붙여 사용한다. class Box { private T item; public void setItem(T item) { this.item = item; } public T getItem() { return this.item; } } 여기서 T는 임의로 지정한 변수명으로 T가 아닌 다른 명칭으로 지정할 수 있다. 위 코드를 ..
[Java] Mockito
[Java] Mockito
2023.07.31Mockito? Mockito는 실제 객체를 모방한 Mock 객체를 쉽게 생성하여 단위 테스트를 진행할 수 있는 오픈소스 프레임워크이다. 아마 프로젝트에서 테스트 코드를 짜본 경험이 있다면 Mockito를 한 번쯤 써봤을 것이다. Mock 프레임워크는 Mockito이외에도 EasyMock, JMock 등이 있다. 그럼 Mockito를 왜 사용하는 걸까? 먼저 다음 예시 코드를 보며 알아보자. @Service public class PostService { private PostRepository postRepository; public PostService(PostRepository postRepository) { this.postRepository = postRepository; } public Pos..
[Java] hashCode()
[Java] hashCode()
2023.07.02hashCode() hashCode()는 객체, 즉 Object에 정의되어 있다. hashCode()는 객체의 주소 값을 변환하여 생성한 고유한 정수 값이다. 만약 같은 객체를 참조하고 있다면 hashCode 값은 동일하게 나온다. 예시로, 다음과 같이 작성하여 출력해보면 정수값을 확인해볼 수 있다. class Person { } public class Test { public static void main(String[] args) { System.out.println(new Person().hashCode()); // ex) 798154996 } } Java의 모든 객체의 최상위 부모는 Object이므로 hashCode() 메서드를 Override하여 재정의할 수 있다. equals()와 hashCo..
[Baekjoon] 16985: Maaaaaaaaaze
[Baekjoon] 16985: Maaaaaaaaaze
2023.06.14문제 아... 너무 길다 다음 링크를 통해 자세한 내용을 확인해보자. [Baekjoon] 16985: 매애애애애애애애애즈 16985번: Maaaaaaaaaze 첫째 줄부터 25줄에 걸쳐 판이 주어진다. 각 판은 5줄에 걸쳐 주어지며 각 줄에는 5개의 숫자가 빈칸을 사이에 두고 주어진다. 0은 참가자가 들어갈 수 없는 칸, 1은 참가자가 들어갈 수 있는 칸을 www.acmicpc.net 3차원 미로 찾기 문제이다. 여기서 조건은 다음과 같다. 판은 회전할 수 있다. 판은 순서가 바뀔 수 있다. 꼭짓점이면서 1인 곳으로만 들어갈 수 있다. 정반대 꼭짓점으로만 나올 수 있다. 위를 고려하면서 풀면 그냥 풀린다. 스터디원 모두 막판 원큐 세레모니를 보여주고 있다. 풀이 내 풀이 import java.io.Bu..