본문 바로가기

SSR19

Redis 활용하여 동시성 문제해결 1. Lettuce - setnx 명령어를 활용해 분산락을 구현할 수 있다. 이는 기존의 값이 없을 때만 set 하는 명령어입니다. spin lock 방식으로 retry 로직을 개발자가 작성해야 합니다. spin lock이란 lock을 획득하려는 스레드가 lock을 사용할 수 있는지 반복적으로 확인하면서 lock을 획득하는 방식 docker로 레디스를 다운로드하고 실행시키자. docker pull redis docker run --name myredis -d -p 6379:6379 redis docker ps 이후 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-redis' 이후 redis cli를 사용하도록 접속 1. k.. 2022. 12. 31.
제한된 리소스에서 살아남기 항상 더 좋은 방법을 찾기 위해 노력한다. 최근 제한된 리소스에서 웹 애플리케이션과 모바일 앱을 위한 API를 주는 하나의 웹 애플리케이션을 개발했다. 제한된 리소스 t3.micro 2Vcore 1 Gib 개발을 마무리한 후 스트레스 테스트에서 메모리 1 GiB는 정말 가혹했다. 기본으로 JVM 할당 값을 계산해 보자. initial HeapSize는 메모리의 1/64이며 이는 약 15~16MB 사이이다. Max HeapSize는 메모리의 1/4이며 따라서 250MB이다. 애플리케이션을 구동시킨 이후 간단하게 테스트를 진행해 보았다. 위 사진은 급하게 HeapMemory를 512MB로 늘리고 swap 메모리 2GB로 설정한 후 진행한 것이다. 그 전에는 한숨자고와도 세상이 멈춰있었다. 정말 말도 안 되는.. 2022. 12. 31.
데이터베이스를 이용한 동시성 이슈 해결하기 동시성 이슈를 해결하기 위해 데이터베이스를 이용할 수 있다. Pessimistic Lock 실제로 데이터에 Lock을 걸어 정합성을 맞추는 방법으로, exclusive lock을 걸게 되면 다른 트랜잭션에서는 lock이 해제되기 전에는 데이터를 가져갈 수 없습니다. 다만 로직에서 다중 커넥션이 필요하거나 중첩 트랜잭션이 있는 경우 등등.. 다양한 이유로 데드락이 걸릴 수 있습니다. @Lock(value = LockModeType.PESSIMISTIC_WRITE) @Query("select s from Stock s where s.id = :id") Stock findByIdWithPessimisticLock(Long id); jpa를 사용하면 @Lock 어노테이션을 제공함으로 써 쉽게 적용할 수 있습니다.. 2022. 12. 25.
아파치 지시어 정적 파일 소스를 가지고 있다면 이를 웹 서버에 배포해야 한다. 리버스 프락시를 통해 요청을 톰캣으로 밀어 넣긴 하는데 정적 파일에 대한 설정을 아파치에 별도로 해주어야 하는데 이 과정에서 설정에 대한 지식이 없어 잠깐 막혔다. 그래서 오늘은 아파치 설정에 대한 정리를 해보려고 한다. 필요한 지시어만 좀 찾아보려고 한다. ServerRoot - 서버 설치 디렉터리 경로로 구성 설정, 오류 정보, 로그 기록 파일이 위치하는 디렉터리이다. -KeepAlive HTTP 지속 연결을 활성화한다. 이는 http 프로토콜이 stateless 방식으로 동작함에 따라 지속적인 요청에 성능적인 개선을 하기 위한 방법으로 이는 수명이 긴 http 세션을 제공하는 것이다. 이를 사용할 수 있는 장소는 http.conf, a.. 2022. 11. 13.
Https 적용 보호되어 있는 글 입니다. 2022. 11. 12.
서블릿 예외 페이지 스프링이 아닌 서블릿 컨테이너는 예외를 어떤 방식으로 처리할까? Exception(예외) 서블릿에서 로직을 처리하다 실제 우리가 접하는 Exception이 발생했을 때 WAS까지 예외가 전달되면서 처리 response.sendError(HTTP 상태 코드, 오류 메시지) Exception java의 main()를 실행하는 경우 main이라는 이름의 스레드가 실행됩니다. 실행 도중에 예외를 catch하지 못하고 처음 실행한 main() 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 스레드는 종료된다. 웹 애플리케이션 사용자 요청 별로 별도의 스레드가 할당이 되고, 해당 스레드가 서블릿 컨테이너 안에서 서블릿의 실제 코드를 실행한다. 웹 애플리케이션에서 예외가 발생했는데, try-catch로 예.. 2022. 1. 13.
Thymeleaf (5) 타임리프는 스프링 없이도 동작하지만 스프링과 통합을 위한 다양한 기능을 제공해주는데, 이러한 부분이 스프링으로 백엔드를 개발하는 개발자가 자연스레 접근하는 계기가 된다. 기본 매뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 스프링 통합 매뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html Tutorial: Thymeleaf + Spring Preface This tutorial explains how Thymeleaf can be integrated with the Spring Framework, especially (but not only) Spring MV.. 2022. 1. 5.
Thymeleaf (4) 자바스크립트 인라인 타임리프는 자바스크립트에서 타임리프를 편리하게 사용할 수 있는 자바스크립트 인라인 기능을 제공한다. 자바스크립트 인라인이란 별도의 자바스크립트 파일을 import 해서 사용하는 것이 아닌 html의 더 멋진 것은 무엇일까? 자바스크립트 객체를 만들어 넣을 수 있다는 것이다. 자바스크립트 인라인 사용 전에는 자바스크립트 문법이 틀려 실행되지 않는다. 문자열은 ", ' 로 감싸주어야 하고, 내추럴 템플릿으로 실행할 수 없으며, 유저 객체는 toString이 찍힌다. 이러한 다양한 문제를 해결하기 위해 toString을 재정의하고, 쿼테이션을 생성해 문자열인 경우에는 붙여주고 숫자인 경우는 그냥 찍도록 분기하는 이러한 모든 코드를 작성하는 것은 많은 시간과 노력이 들어간다. 자바스크립트 인.. 2022. 1. 5.
Thymeleaf (3) 속성 값 설정 타임리프 태그 속성(Attribute) 타임리프는 주로 HTML 태그에 th:* 속성을 지정하는 방식으로 동작한다. th:* 로 속성을 적용하면 기존 속성을 대체한다. 기존 속성이 없으면 새로 만든다. - input 태그의 name속성의 값을 "hi"로 설정한 후 th:name ="test"라는 타임리프의 속성을 지정했다면 최종 결과 값은 다음과 같이 렌더링 된다. 속성 추가 속성의 이름을 변경하는 것 말고도 속성을 추가하는 일도 빈번하게 발생한다. 타임리프는 th:attrappend로 속성을 추가할 수 있다. 여기서 주의할 점은 타임리프의 attrappend="class=' large'" 작은 따옴표를 사용했다는 점이다. 또한 한 칸 띄웠다는 점이다. th:attrappend는 뒤에 붙지.. 2022. 1. 4.
Thymeleaf (2) ◦ 링크 URL 표현식: @{...} 타임리프에서 태그의 location.href 속성에 많이 사용하는 URL 링크에는 별도의 표현식이 존재한다. URL 링크 basic url hello queryparam path variable path variable + query parameter - th:href= " @{ ( param1=${param1}, param2=${param2} ) } " 쿼리 파라미터를 붙여주는데 콤마(,)로 구분해 여러 개를 제공할 시 자동적으로 &으로 변환되어진다. - th:href= " @{ /hello/{param1}( param1=${param1}, param2=${param2} ) } " 이 경우는 param2의 값이 남는데, 남은 param2는 쿼리 파라미터로 넘어가게 .. 2022. 1. 4.