Programming
-
[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를 이용해..
-
[Java] StreamProgramming/Java 2024. 6. 16. 20:49
Stream APIJava는 객체지향언어이기 때문에 기본적으로 함수형 프로그래밍이 불가능하다.JDK8부터 Stream API와 람다식, 함수형 인터페이스 등을 지원하면서 Java를 이용해 함수형으로 프로그래밍할 수 있는 API를 제공한다.그 중에서 Stream API는 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의해두었다.(데이터 추상화 : 데이터의 종류에 상관 없이 같은 방식으로 데이터를 처리할 수 있다는 것을 의미, 재사용 높임) 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 값 요소 Stream API의 특징1. 원본 데이터를 변경하지 않는다.원본데이터를 조회하여 원본의 데이터가 아닌 별도의 요소들로 Stream생성한다. 그렇기 때문에 원본의 데이터는 읽기만 할 뿐, 정렬이나 ..
-
[Java] currentTimeMillis() nanoTime() Instant.now() uuidProgramming/Java 2024. 5. 31. 16:09
Java는 시간 값을 측정하는 두 가지 기본 메소드를 제공한다. System.currentTimeMillis()는 현재 시간을 밀리초 단위로 반환한다.System.nanoTime()은 현재 시간을 나노초 단위로 반환한다. 두 가지 방법은 상당한 차이가 있다. 시간은 계속 흘러가기 때문에 시간을 고유한 값으로 사용하는 경우가 많다. 이런 경우 어떤 메소드로 사용해야 할지 알아보자. System.currentTimeMillis()밀리초 단위 사용(ms)1970년 1월 1일 UTC시작 시점을 기준으로 현재까지 계산시스템 시간을 참조(운영체제의 시간 값을 기준)-> 날짜와 날짜 사이의 갭을 구할 때 사용1초 = 1000밀리초 장점1. thread safe2. 항상 epoch이후 경과된 절대 시간을 반환한다. ..
-
[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(); } ..