본문 바로가기

서버

(14)
스프링부트가 다중 유저 요청을 처리하는 방법 (Thread Pool, Thread Safe) 스프링 요청 처리 과정 내장 서블릿 컨테이너인 Tomcat을 이용한다. Tomcat은 다중 용청을 처리하기 위해서 부팅할 때 스레드 컬렉션인 Thread Pool을 생성한다. 유저 요청이 들어온다 (HttpServletRequest) 스레드 풀에서 하나씩 Thread를 할당함 해당 Thread에서 스프링 부트에서 작성한 dispatcher servlet을 거쳐 유저 요청을 처리한다. 작업을 끝내고 나면 스레드는 스레드풀로 반환된다. application.yml 에서 아래처럼 톰캣설정을 바꿔줄 수 있다. # application.yml (적어놓은 값은 default) server: tomcat: threads: max: 200 # 생성할 수 있는 thread의 총 개수 min-spare: 10 # 항상 활..
파이프라인, CI/CD, 젠킨스 개념 새로 개발한 애플리케이션을 쿠버네티스에서 사용하는 과정 깃허브 등 저장소에 저장해둔 애플리케이션 소스 코드를 내려받아 도커 컨테이너 이미지로 빌드 (docker build) 빌드한 컨테이너 이미지를 쿠버네티스에서 사용할 수 있도록 레지스트리에 등록 (docker push) 등록된 이미지를 기반으로 쿠버네티스 오브젝트 생성 (kubectl create) 생성한 오브젝트(파드, 디플로이먼트)를 외부에서 접속할 수 있도록 서비스 형태로 노출 (kubectl expose) 파이프라인 이런 과정을 파이프라인이라고 한다. 파이프라인을 자동화할 수 있는데, 자동화는 크게 지속적 통합 CI, 지속적 배포 CD로 나눈다. CI/CD는 실무적인 환경에서 변경 사항을 계속 추적해 좀 더 안정화된 애플리케이션으로 만들고, 이..
[Spring/Kotlin] Entity는 data class로 구현하는게 좋을까? Entity는 data class로 구현하는게 좋을까? 본론부터 이야기면 Entity는 data class로 구현하면 안된다. data class의 특징 데이터 클래스는 toString() , hashCode() , equals() , copy()메소드를 자동으로 만들어준다. data class는 상속이 안된다. = open이 아닌 final이다. 이유 : data class에서 기본으로 제공되는 메소드들을 제대로 오버라이딩해서 구현할 수 없기 때문에 data class는 상속하지 못하도록 만들어졌다. entity class의 요구사항 https://docs.oracle.com/javaee/5/tutorial/doc/bnbqa.html Requirements for Entity Classes An ent..
[kotlin] spring jpa에서 복합키를 사용하는 방법, @EmbeddedId, @IdClass jpa에서 복합키(pk가 여러 개)를 가진 테이블을 정의하려면, 키(이하 pk)들을 따로 뺀 클래스(이하 pk 클래스)를 별도로 정의하고 entity 클래스로 가져와야 한다. 이에 대한 구현은 각각 @EmbeddedId, @IdClass를 활용한 2가지로 할 수 있다. 결론부터 말하자면 두 방법이 본질적으로는 차이가 없으나 구현하는 방법과 사용하는 방법이 다르니 편한 것으로 선택하면 된다. @EmbeddedId pk클래스에 **@**Embeddable 어노테이션을 지정해줘야 한다. pk클래스를 Serializable 인터페이스로 구현해야 한다. pk클래스에 대한 기본 생성자가 필요하다 - build.gradle.kts에서 kotlin-jpa 플러그인 혹은 kotlin-noarg 플러그인을 추가했다면 @E..
커버로스(Kerberos)란? 동작 이해하기 커버로스란? - 커버로스는 티켓 기반의 컴퓨터 네트워크 인증 암호화 프로토콜이다. - 커버로스를 이용하면 티켓을 가진 유저만 서버에 접속할 수 있도록 제어할 수 있으므로 서버 접근 권한 관리가 편해진다. 티켓 기반? 커버로스에서 사용하는 티켓은 아래 정보들을 안전하게 전달하는데 사용되는 정보 패킷이다. 티켓을 발급할 때 secrey key로 정보들을 암호화한다. 유저 아이디 유저 호스트 IP주소 timestamp 티켓 수명 세션키 암호화된 위 정보들을 통해서 서버와 유저(클라이언트)는 서로 믿을 수 있는 대상인지를 몇가지 과정을 거치며 확인한다. 커버로스 동작 과정 동작 과정을 이해하기 위한 사전 지식 커버로스는 대칭키 암호화 방법으로 암호화화 복호화에 사용하는 키가 같다. 즉, 암호화할 때 쓰인 key..
[Spring] 하나의 build.gradle 파일로 여러 내부 프로젝트 빌드하기 하나의 프로젝트 내부에 여러개의 subProject가 존재하는 프로젝트의 경우 아래와 같이 build.gradle 파일이 여러개다. (서브 프로젝트 들이 모두 같은 빌드로직을 따른다면 여러 개일 필요 없다.) 전체 프로젝트 build.gradle 서브 프로젝트 각각의 build.gradle build.gradle buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-noarg:${kotlinVers..
@RequestBody로 지정한 객체에 꼭 기본 생성자가 필요할까? (com.fasterxml.jackson.databind.exc.InvalidDefinitionException) 에러 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `객체!` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 에러 메세지를 읽어보면 requestBody로 전달되는 객체에 기본 생성자가 없어서 에러가 난다는 뜻이다. request로 전달되는 객체의 기본 생성자 아래처럼 requestBody로 전달되는 객체는 아무 파라미터를 넣지 않아도 생성되는 기본 생성자가 필요하다. @PostMapping("/page/data")..
[Spring] EHcache를 이용해 캐시 간단하게 적용하기 (feat. @ Cacheable) 자주 바뀌는 값이 아닌데, 데이터베이스에 접근해서 가져오는데 시간이 걸려서 불편할 때가 있다. 이럴 때 간단하게 서버 단에서 캐시로 들고 있을 수 있다. 필요성 데이터 중 매번 실시간 데이터를 반드시 반영해야 하는 경우가 아닐 때 복잡한 쿼리라 가져오는 작업이 빠르지 않을 때 위와 같은 경우 캐시 라이브러리를 이용해서 관리하면 성능에 도움이 된다. 스프링의 어노테이션을 이용해서 쉽게 캐싱처리를 할 수 있다. EHcache 자바 기반 캐시 오픈소스 기본 JVM메모리에 저장된다. 레디스처럼 별도의 서버 설치 없이 사용할 수 있어, 가볍게 사용하기 좋다. EHcache는 로컬캐시로서 특정 서버에 종속된다. → 따라서 멀티 서버 환경에서는 데이터 싱크가 필요하다. 장 : 데이터 접근이 빠르다. 단 : 동기화가 ..

반응형