Programming/SpringBoot
-
[SpringBoot] OOME, hprof 덤프 파일, 메모리 디버깅Programming/SpringBoot 2024. 7. 31. 16:20
hprof 생성hprof 덤프 파일을 생성하기 위해서는 JVM실행 옵션을 설정하면 됩니다. 인텔리제이를 사용중이므로 인텔리제이 옵션 설정으로 어플리케이션 실행시 적용되도록 해봅시다. Edit Configurations > Modify options > add VM optionsadd VM options 버튼을 클릭하면 추가 입력 칸이 생깁니다. 입력 칸에 JVM 힙 메모리, OOME 발생시 덤프 파일을 생성하는 옵션, 덤프 파일 저장 경로를 입력합니다.-Xmx50m-Dfile.encoding=UTF-8-Dconsole.encoding=UTF-8-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=E:\dump Shallow Size: 객체를 저장하는 데에 사용된 메모..
-
[SpringBoot] batchUpdate()를 활용한 bulkInsertProgramming/SpringBoot 2024. 7. 30. 16:49
saveAll()jpa에서 제공하는 saveAll() 메소드를 사용하면 100건 등록시 insert가 100번 수행됩니다.100명의 사용자가 각각 saveAll()메소드를 사용한다면 100*100 = 10000 번의 insert가 수행되는 것입니다. 요청 사용자가 많을 수록 데이터베이스 성능 저하의 원인이 되고 결과적으로 서버 응답 시간이 길어지게 됩니다. spring data jpa구현체인 SimpleJpaRepository를 확인해보면 saveAll() 메소드 내부에서 for문을 통해 save() 메소드를 호출합니다.@Override @Transactional public List saveAll(Iterable entities) { Assert.notNull(entities, "Entities..
-
[Spring] ModelMapper MapStructProgramming/SpringBoot 2024. 7. 2. 13:41
Object MappingController, Service, Repository 등 레이어 간 데이터를 주고 받을 때 하나의 객체를 타입이다른 객체로 형변환하는 일이 빈번하게 발생한다. ( DTO와 Entity간 형변환 과정)이런 작업을 개발자가 모두 직접하게 되면 발생하는 문제점이 있다.반복적이고 코드 중복이 발생실수하기 쉽다필드 추가, 수정, 삭제가 일어날 경우 변환하는 로직에 대해 수정이 필요하다비즈니스 로직에 섞이게 되면 코드가 복잡해진다결국 생산성이 떨어진다.Object Mapping라이브러리는 이런 문제를 해결해주는 도구이다. ModelMapper, MapStructObject Mapping을 위한 Model Mapper와 MapStruct라이브러리가 있다. MapStruct는 컴파일 시..
-
[Spring] TransactionProgramming/SpringBoot 2024. 6. 20. 10:00
트랜잭션더 이상 쪼갤 수 없는 최소 단위의 작업트랜잭션 경계 안에서 진행된 작업은 모두 성공하던지 모두 취소돼야 함 트랜잭션 속성● 트랜잭션 전파 Propagation트랜잭션 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할 것인가를 결정하는 방식▷ PROPAGATION_REQUIRED가장 많이 사용진행 중인 트랜잭션이 없으면 새로 시작하고 이미 시작된 트랜잭션이 있으면 이에 참여함 ▷ PROPAGATION_REQUIRES_NEW항상 새로운 트랜잭션을 시작한다.독립적인 트랜잭션이 보장돼야 하는 코드에 적용할 수 있다. ▷ PROPAGATION_NOT_SUPPORTED트랜잭션 없이 동작하도록 만들 수 있다.진행 중인 트랜잭션이 있어도 무시한다.트랜재션 경계설정은 보통 AOP를 이용해..
-
[Spring] Spring에서 JSON 파라미터를 Java객체로 받기Programming/SpringBoot 2024. 5. 27. 15:10
Spring에서 Request,Response로 전달되는 파라미터 정보를 컨트롤러에서 어떻게 Java객체로 받을까?Spring에서 HttpMessageConvert가 그 역할을 담당하고 있다.Request, Response내에는 모두 text형식이라고 할 수 있다. 이를 Java자료형으로 변환해주는 역할을 한다. HttpMessageConvertByteArrayHttpMessageConvertStringHttpMessageConvertFormHttpMessageConvertSourceHttpMessageConvertJax2RootElementHttpMessageConvertMarshallingHttpMessageConvertMappingJackson2HttpMessageConverter....이외에도 S..
-
[Spring] Content-Type 'application/octet-stream' is not supportedProgramming/SpringBoot 2024. 5. 27. 15:01
컨트롤러에서 이미지 파일과 dto를 잘 받아오는지 확인하려는 메소드를 실행했을때 @LoginRequired @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity test(@RequestPart(value = "files") List files, @RequestPart(value = "postDto") PostDto postDto, @LoginMember MemberDto memberDto){ if(files.isEmpty()){ return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } ..
-
[Spring] 로그인 세션 관리Programming/SpringBoot 2024. 5. 21. 17:22
세션Session세션은 서버에 값을 저장한다.서버는 세션을 사용해서 클라이언트의 상태를 유지할 수 있다. 세션 관리는 왜 필요할까?웹은 HTTP 프로토콜을 사용한다.HTTP는 connectionless, stateless 특징을 가지고 있다.비연결성, 서버가 클라이언트의 상태를 저장하지 않는다는 것이다.어떤 사용자가 어떤 세션을 사용하고 있는지 알 수 없기 때문에 세션 관리가 필요하다.즉, 로그인한 사용자 정보를 유지하기 위한 목적으로 세션을 사용한다. session의 동작 과정Spring Boot는 기본 서블릿 컨테이너로 Tomcat을 사용한다.Tomcat의 경우 세션 id로 JSESSIONID를 사용한다. 서버에서 세션을 만드는 시점은?클라이언트가 요청하면 서버에서 세션 아이디가 없을 때 세션을 만들..
-
[Spring] 테스트 코드Programming/SpringBoot 2024. 5. 14. 13:51
단위 테스트, 통합 테스트단위 테스트 Unit Test작은 단위의 코드에 대해 테스트를 수행하는 것개발자가 설계하고 만든 코드가 원래 의도대로 동작하는지를 개발자가 스스로 빠리 확인 받기 위해서 한다. 스프링부트에서의 단위 테스트와 통합 테스트를 구분하는 것으로 "@SpringBootTest 어노테이션 사용 유무"를 들 수 있다.@SpringBootTest 어노테이션을 사용하지 않는 것을 단위 테스트라고 하자.이는 스프링을 전혀 실행하지 않는다는 것이다. 디팬던시가 전혀 없는 상황에서 실행할 수 있는 테스트이다. 통합 테스트 Integration Test @SpringBootTest 어노테이션을 사용한다면 통합 테스트라고 하자.@SpringBootTest는 스프링을 실행시켜야 한다. 따라서 Spring..