728x90

Backend/Spring+Boot 64

[JPA] SpringBoot JPA 설정

우선 SpringBoot 에서 JPA 설정을 위해 서칭을 하다보면 많은 javaConfig 로 여러 셋팅을 하는 포스팅이 나오지만 그 대부분은 Spring 기준으로 작성된 것이고 SpringBoot 에서는 대부분 자동으로 처리를 해주기 때문에 필요없는 것들이 더 많다. Spring 환경에서는 javaConfig 방식으로 Datasource 빈을 만들어서 이걸 기반으로 EntityManagerFactory 빈을 만들고 또 다시 이걸 기반으로 TransactionManager 빈을 만든다. 추가로 @EnableTransactionManagement 도 추가해서 어노테이션으로 트랜잭션을 관리할 수 있도록 해줘야 한다. 아래 포스팅은 이에 대한 가장 정석적인 내용이다. http://www.devkuma.com/..

Backend/Spring+Boot 2021.12.08

Mapstruct 주의사항

Mapstruct vo, dto, entity 간 변환을 쉽게 할 수 있도록 해준다. 사실 전에는 클래스마다 static of 메소드를 만들어서 변환시 마다 빌더를 직접 코딩했는데 payload 방대할 경우 이게 참 못할 짓이다. 일반적으로 로직을 고민하는 시간이 코드를 작성하는 시간보다 훨씬 오래 걸리는데 방대한 payload 에 대해 빌더를 직접 코딩하다보면 반대 상황에 놓이게 되고 하나의 오타가 반나절을 잡아먹기도 한다. Mapstruct 대한 예제는 정말 많으니 그걸 참고하도록 하고 여기에서는 주의사항에 대해 기록하고자 한다. 사람마다 다르겠지만 나는 request 데이터를 매핑하는 vo 클래스는 immtable 로 만드는 것을 선호한다. 클래스를 immtable로 만드는 방법은 간단하다. 생성자..

Backend/Spring+Boot 2021.11.30

SpringBoot 내장톰캣 JVM 메모리 default 값

일단 SpringBoot 환경에서 패키징 결과물로 생성된 jar 파일을 실행할 때 실행옵션을 주면 JVM 메모리를 설정할 수 있다. java -jar -Xms1024M -Xmx1024M app.jar 그 외 톰캣이 구동될 때 참조하는 CATALINA_OPTS, JAVA_OPTS 와 같은 환경변수에 -Xms1024M -Xmx1024M 를 지정해놔도 된다. 알다시피 Xms 는 초기힙사이즈, Xmx는 최대힙사이즈이다. 그렇다면 아무런 설정을 하지 않을 경우 메모리 기본 설정값은 어떻게 될까? 이는 jvm 의 설정을 그대로 따라가는데 물리메모리의 1/64를 초기 힙사이즈로 할당하고 1/4을 최대 힙사이즈로 할당한다. 만약 쿠버네티스 환경이라면 pod 이 배포되는 노드의 메모리를 위에서 말하는 물리메모리라고 보면..

Backend/Spring+Boot 2021.11.15

Feign 파일 전송하기

RestApi를 통해 파일을 전송해야 할 일이 있었다. RestClient 로는 Feign을 사용하고 있었기 때문에 그걸 사용하고자 했고 해당 내용으로 구글링을 해보니 많은 자료가 나왔다. 개인의 포스팅이 아니라 약간 공식적인 단체? 같은 곳에 기록되어 있는 것을 예로 들면 아래와 같은 것들이다. https://www.baeldung.com/java-feign-file-upload https://recordsoflife.tistory.com/206 너무 간단하다. 처음에 이걸 보고 구현을 쉽게 생각했는데 결국 성공하지 못하고 일주일을 허비했다. 물론 중간중간 운영업무가 있어서 물밀듯이 들어온 것도 한 몫 했지만 일주일 간 구글링에서 나오는 모든 자료를 뒤져보았지만 모두 다 위와 같은 방식이었다. 위에서 ..

Backend/Spring+Boot 2021.08.09

Ajax와 @RequestBody, @ResponseBody

너무 단순한 주제지만 프로젝트를 분석하다보면 잘못 사용된 경우도 있고 나도 제대로 알지 못하고 사용했던 부분이 있어 정리해놓는다. 우선 아래와 같은 Controller 메소드가 있다고 가정해보자. 해당 메소드에서는 @RequestBody 에 의해 request body 에 있는 json 문자열을 Map 타입 payload로 역직렬화 해서 읽어오고 @ResponseBody 에 의해 Map 타입 map 을 json 문자열로 직렬화해서 리턴한다. @PostMapping("/update") @ResponseBody public Map update(@RequestBody Map payload) { Map map = new HashMap(); map.put("test", "test"); return map; } 위..

Backend/Spring+Boot 2021.08.04

@RequestParam, @ModelAttribute 생략

Spring 기반 프로젝트에서 Controller 내부 메소드의 인자에 지정하는 어노테이션이다. 일반적으로 primitive type은 @ReuqestParam 로 지정하고 reference type 은 @ModelAttribute 로 지정한다. 그런데 만약 이를 생략하면 어떻게 되나? primitive type는 자동으로 @ReuqestParam을 지정한 것처럼 동작하고 reference type은 자동으로 @ModelAttribute를 지정한 것처럼 동작한다. 그런데 또 한가지 중요한 사실이 있으니 @ReuqestParam 의 required 는 default 가 true로 요청시 해당 파라미터가 존재하지 않으면 기본적으로 에러가 발생한다. 파라미터로 primitive type 를 사용하고 @Reuq..

Backend/Spring+Boot 2021.08.04

Thymeleaf 훑어보기

기본적인 개발 방식 일반적으로 화면을 구성할 때 top, footer 영역은 거의 변하지 않고 content 영역만 달라진다. 이에 Thymeleaf 는 기본적으로 top, content, footer 의 배치가 정의된 레이아웃을 html 로 미리 만들어 놓고 이를 이용해서 실제 페이지를 만드는 방식을 사용한다. 레이아웃도 여러개를 만들어서 사용할 수 있고 여기에 사용되는 top, footer 는 거의 변하지 않으므로 일반적으로 특정 html 로 생성해놓고 재활용하는데 이를 컴포넌트라고 명명한다. 이는 jsp 의 include 방식과 비슷하다. 결국 레이아웃에는 top, content, footer 가 정의되어 있지만 content 의 실제 구현부는 비어있는 상태로 정의되고 실제 페이지 개발시 conte..

Backend/Spring+Boot 2021.07.30
728x90