전체 글 243

[Network] 웹 서버와, 웹 애플리케이션 서버 (+ Apache, Apache Tomcat, Nginx)

웹 서버와 웹 애플리케이션 서버(WAS)의 개념은 다소 다릅니다. 이 글에서는 웹 서버와 웹 애플리케이션 서버의 차이를 설명하고, 어떤 종류가 있는지 소개하고자 합니다.네트워크와 인터넷네트워크네트워크는 두 개 이상의 컴퓨터나 장치가 서로 데이터를 주고받기 위해 연결된 시스템이다. 네트워크는 다양한 크기와 형태로 존재할 수 있다.LAN (Local Area Network): 제한된 지역 내의 네트워크로, 예를 들어 사무실이나 가정 내의 네트워크가 이에 해당한다.WAN (Wide Area Network): 넓은 지리적 범위를 아우르는 네트워크로, 여러 도시나 국가를 연결할 수 있다.MAN (Metropolitan Area Network): 한 도시나 대도시 지역을 커버하는 네트워크이다.PAN (Persona..

[개발 일기][Spring] grafana_session 쿠키 문제와 Custom Login Filter 구현하기

제 프로젝트에서 Spring Security로 구현한 인증 로직에서는, 인증이 필요한 엔드포인트에 접근할 때 JSESSIONID가 쿠키에 포함되어 있는지를 검사하는 로직이 있었습니다. 하지만 같은 도메인에 접근하는 경우, 모든 요청에 쿠키가 함께 전송되기 때문에 문제가 발생했습니다.이 글에서는 grafana를 사용할 때 grafana_session이라는 쿠키의 path가 '/'로 되어있어서, Spring Security Session Filter에서 쿠키 검사 시 인증이 되지 않았던 문제 상황과 해결 과정을 소개합니다.문제 상황위처럼 FilterChain에서 permitAll()이 설정되어 있는 링크를 접속했더니 이런 예외를 발생시켰다.아니 왜 permitAll이 설정되어 있는 엔드포인트 접근인데 인증이..

Development/Diary 2024.07.17

[Database] DBCP (DB connection pool)과 hikariCP, MySQL을 기준으로

백엔드 애플리케이션이 API 요청을 받으면 종종 데이터를 검색하거나 조작하기 위해 데이터베이스와 상호작용해야 합니다. 이 상호작용은 데이터베이스에 쿼리를 보내고 데이터베이스가 쿼리에 응답하는 과정을 포함합니다. 데이터를 처리한 후 애플리케이션은 API 요청자에게 응답을 보냅니다. 백엔드와 데이터베이스 간의 통신은 TCP(Transmission Control Protocol)를 통해 이루어집니다. TCP는 데이터 전송에서 높은 신뢰성을 제공하기 때문에 선택됩니다. TCP 연결을 설정하는 과정에는 연결을 열기 위한 3-way handshake와 연결을 닫기 위한 4-way handshake가 포함됩니다. TCP는 신뢰할 수 있는 통신을 보장하지만, 쿼리를 실행할 때마다 Connection을 열고 닫는 과정은..

[Spring] 서버 모니터링을 위한 Spring Actuator, Prometheus, Grafana 추가하기

모니터링은 애플리케이션의 성능과 안정성을 유지하기 위해 필수적인 요소입니다. 서버의 상태를 실시간으로 파악하고, 성능 이슈를 사전에 감지하여 대응할 수 있게 해 줍니다. 이를 통해 서비스의 가용성을 높이고, 안정적인 서비스를 운영할 수 있습니다. 이번 글에서는 Spring Boot 애플리케이션에 Spring Actuator를 추가하고, Prometheus와 Grafana를 사용하여 모니터링을 설정하는 방법을 알아보겠습니다.모니터링 정보모니터링을 하면서 수집하는 주요 정보는 시스템이나 애플리케이션의 상태, 성능 및 동작을 평가하는 데 사용되는 모든 종류의 데이터를 포함한다. 여기에는 metric, log, trace, event 등의 다양한 데이터가 포함될 수 있다. 모니터링 정보의 구성 요소metric:..

Development/Spring 2024.07.12

[Spring] Redisson을 활용한 캐시 사용하기

이전글에서 다루었듯 Gatling을 사용한 서버 부하 테스트를 진행해 보았습니다. 서버 과부하로 인한 Fail도 있었고, 응답 시간이 매우 길어지는 크게 두 가지 문제가 있었습니다. 서버 과부하를 해결하기 위해선 분산 서버를 운영하여 로드 밸런서를 추가 하거나, 메세지 큐를 활용해서 대기하도록 할 수 있습니다. 응답 시간의 경우 데이터베이스 튜닝이나 캐싱을 사용함으로써 해결할 수 있습니다.이 글에서는 Redis를 캐시 메모리로 사용하여 서버의 성능을 개선하는 방법에 대해 다루고자 합니다. 특히, Java 환경에서 Redisson을 활용하여 Spring 애플리케이션에 Redis 캐시를 적용하는 방법을 중점적으로 설명합니다.Caching과 RedisCache MemoryCache Memory는 중요하고 자주..

Development/Spring 2024.07.11

[Spring] Gatling 으로 서버 부하 테스트하기

서버의 성능을 향상하려면 현재 서버가 어느 정도의 부하를 견딜 수 있는지, 그리고 어떤 부분에서 병목 현상이 발생하는지에 대한 명확한 지표가 필요합니다. 이러한 지표를 얻기 위해서는 실제로 서버에 부하를 가해보는 부하 테스트(Load Testing)가 필수적입니다.Spring에서 사용할 수 있는 부하 테스트 툴을 찾아보다가 Gatling에 대해 알게되었는데요, 이 글에서는 Gatling이 무엇인지, 그리고 어떻게 적용하여 서버의 부하 테스트를 수행할 수 있는지에 대해 알아보겠습니다.Gatling이란?Gatling은 오픈 소스 기반의 고성능 부하 테스트 도구로, 주로 웹 애플리케이션의 성능 테스트에 사용된다. Scala와 Java를 지원하며, 간단한 설정만으로도 부하 테스트를 수행할 수 있는 것이 장점이다..

Development/Spring 2024.07.09

[DataStructure] Java에서 Linked List는 Queue와 List를 모두 사용할 수 있다. + (Iterable, Collection, List, Queue ... 요약)

코딩 테스트 문제를 풀면서 문득 'LinkedList는 List로도 사용할 수 있고, Deque로도 사용할 수 있는 것 같네' 란 생각이 들었는데요, List와 Deque를 모두 구현하고 있었군요.위 이미지는 LinkedList가 상속하고 구현하고 있는 클래스, 인터페이스 들을 다이어그램으로 표시한 그림인데요, 이 글에서는 이 LinkedList와 관련된 각 클래스, 인터페이스를 살펴보고자 합니다. IterableIterable 인터페이스는 Java에서 컬렉션을 순회하는 표준 방법을 제공한다. 이 인터페이스는 컬렉션의 요소들을 순회할 수 있도록 해준다. Iterator iterator()Iterable 인터페이스는 Java에서 컬렉션을 순회하는 표준 방법을 제공한다.주요 메서드는 다음과 같다.Iterat..

[Diary] Spring 비관적 락(Pessimistic Lock)과 MVCC 동작의 조합으로 발생할 수 있는 이상 현상(+Snapshot)

이 글에서는 비관적 락을 사용하였음에도 멀티 스레드 환경에서 원하는 결괏값이 나오지 않아 발생한 문제 상황에 대해 작성하고자 합니다.문제 상황: 한 스레드가 새로운 레코드를 Insert 하고 다른 스레드가 findAll() 했을 때 새로운 레코드를 읽지 않는다?문제 재현UserTest@Entity@Getter@Setterpublic class UserTest { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(nullable = false) private String username;}UserTestRepository@Repositorypublic interface UserTestRepos..

Development/Diary 2024.06.11

[Diary] Spring 테스트 관리 트랜잭션(Test-managed transactions)과 테스트 생명주기 + 멀티 스레드에서 테스트 문제

Spring에서 테스트 관리 트랜잭션(Test-managed transactions)은 통합 테스트(integration test) 중에 트랜잭션이 자동으로 관리되고, 테스트 메서드가 종료되면 자동으로 롤백되는 트랜잭션입니다. 이러한 트랜잭션은 Spring에서 관리되는 트랜잭션(테스트를 위해 로드된 ApplicationContext 내에서 직접적으로 Spring에 의해 관리되는 트랜잭션)이나 애플리케이션에서 관리되는 트랜잭션(테스트에서 호출되는 애플리케이션 코드 내에서 프로그래밍 방식으로 관리되는 트랜잭션)과는 다릅니다. 메서드 수준의 생명주기 메서드(예: JUnit Jupiter의 @BeforeEach 또는 @AfterEach로 주석이 달린 메서드)는 테스트 관리 트랜잭션 내에서 실행됩니다. 반면 클래..

Development/Diary 2024.06.02

[Spring] ThreadLocal에 대해 알아보자 + SecurityContextHolder, RequestContextHolder

Java Spring에서는 Thread 마다 고유한 데이터를 가지기 위해 ThreadLocal 클래스를 사용합니다. 이 글에서는 ThreadLocal이 무엇이며 어디서 활용되고 있는지에 대해 알아보겠습니다.Thread스레드(Thread)는 프로세스 내에서 실행되는 가장 작은 단위의 작업이다. 하나의 프로세스는 여러 스레드를 가질 수 있으며, 각 스레드는 독립적으로 실행된다. 스레드는 동일한 메모리 공간을 공유하며, 서로 다른 스레드가 동시에 실행될 수 있기 때문에 멀티스레딩을 통해 병렬 처리가 가능해진다. Spring 애플리케이션, 특히 웹 애플리케이션에서는 일반적으로 요청당 스레드(Thread-Per-Request) 모델을 사용한다.이는 클라이언트의 HTTP 요청마다 별도의 스레드를 생성하여 그 요청을..

Development/Spring 2024.05.28