본문 바로가기

서버/SpringBoot

(6)
스프링부트가 다중 유저 요청을 처리하는 방법 (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 # 항상 활..
[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..
[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는 로컬캐시로서 특정 서버에 종속된다. → 따라서 멀티 서버 환경에서는 데이터 싱크가 필요하다. 장 : 데이터 접근이 빠르다. 단 : 동기화가 ..

반응형