반응형 개발134 자바 메모리 누수 c언어는 free() 함수를 사용해 메모리를 해제한다. 자바는 GC가 더 이상 사용하지 않는 힙 영역의 인스턴스 메모리를 알아서 해제해준다. 그렇다면 GC가 메모리를 해제해주므로 자바에서 메모리 누수는 아예 발생하지 않을까?? 결론부터 말하면 자바에서도 메모리 누수는 발생할 수 있다. 객체가 실제로 사용되지 않으면서 의도치 않게 참조를 가지고 있다면, 이는 메모리 누수의 원인이 된다. 자바에서 메모리 누수는 프로그래머의 실수로 발생하는 것이다. 자바 메모리 누수와 관련해서 자주 발생하는 패턴을 살펴보기 전에 먼저 GC 대상에 대한 기초를 잡자. GC 대상 GC는 힙 내의 객체 중에서 가비지를 찾아내고, 찾아낸 가비지를 처리해서 힙의 메모리를 회수한다. 그럼 어떤 객체가 가비지일까?? Java GC는 객체.. 개발/Java 2023. 12. 9. Chunk Process Chunk Chunk란 여러 개의 아이템을 묶은 하나의 덩어리, 블록을 의미 한번에 하나씩 아이템을 입력 받아 Chunk 단위의 덩어리로 만든 후 Chunk 단위로 트랜잭션을 처리함, 즉 Chunk 단위의 Commit과 Rollback이 이루어짐 일반적으로 대용량 데이터를 한번에 처리하는 것이 아닌 청크 단위로 쪼개어서 더 이상 처리할 데이터가 없을 때까지 반복해서 입출력하는데 사용된다. Chunk는 ItemReader로 읽은 하나의 아이템을 Chunk에서 정한 개수만큼 반복해서 저장하는 타입 Chunk는 ItemReader로부터 전달받은 Chunk를 참조해서 ItemProcessor에서 적절하게 가공, 필터링한 다음 ItemWriter에 전달하는 타입 아키텍쳐 ChunkOrientedTasklet Ch.. 개발/Spring Batch 2023. 11. 10. FlowJob FlowJob Step을 순차적으로만 구성하는 것이 아닌 특정한 상태에 따라 흐름을 전환하도록 구성할 수 있으며 FlowJobBuilder에 의해 생성된다. Flow와 Job의 흐름을 구성하는데만 관여하고 실제 비즈니스 로직은 Step에서 이루어진다. 내부적으로 SimpleFlow 객체를 포함하고 있으며 Job 실행 시 호출한다. 사용해야하는 경우 Step이 실패하더라도 Job은 실패로 끝나지 않도록 해야 하는 경우 Step이 성공했을 때 다음에 실행해야 할 Step을 구분해서 실행해야 하는 경우 특정 Step은 전혀 실행되지 않게 구성해야 하는 경우 조건적 흐름이 필요하면 FloJob, 순차적 흐름은 SimpleJob 활용 배치 상태 유형 BatchStatus JobExecution과 StepExecu.. 개발/Spring Batch 2023. 11. 7. 테스트 성능 개선 오늘은 프로젝트 테스트 성능을 개선한 이야기를 써보려고 합니다. 로컬에서 진행했으며, 컴퓨터 스펙은 M1 AIR(8코어) RAM 16GB SSD 512 입니다. 프로젝트 설명 간단하게 프로젝트 구조에 대해 설명하겠다. 멀티 모듈 프로젝트는 스프링 부트를 사용하고 있으며, 멀티 모듈로 구성돼 있다. api 모듈은 프레젠테이션 영역으로 인수 테스트와 컨트롤러 단위 테스트(Spring Rest Docs 생성)를 진행하고 있다. core 모듈은 비즈니스 로직을 수행하며 핵심 도메인 모델 클래스로 구성되어 있다. 통합 테스트와 단위 테스트를 진행하고 있다. 이 두 모듈의 테스트 성능을 개선해보려고 한다. 통합 테스트 운영 코드와 동일한 테스트 코드를 가지기 위해 명시적 롤백 전략을 사용하고 있다. 쉽게 말해 테스.. 개발/Test 2023. 11. 3. Executor와 TaskExecutor 이모저모 Java Executor Executor public interface Executor { void execute(Runnable command); } 제출된 Runnable 작업을 실행하는 객체이다. 태스크 제출과 각 태스크가 어떻게 실행될 것인지의 메커니즘을 분리하는 방법을 제공하며, 이는 스레드 사용, 스케줄링 등의 세부 사항을 포함한다. Executor는 일반적으로 명시적으로 스레드를 생성하는 대신 사용된다. 보통 스레드 풀을 사용하는 구현체가 많다. Executor 인터페이스는 실행이 반드시 비동기라는 것을 요구하지 않는다. Executor는 제출된 태스크를 즉시 호출자 스레드에서 실행할 수도 있다. Execuotr에서는 보통 태스크는 호출자의 스레드가 아닌 다른 스레드에서 실행된다. 많은 Ex.. 개발/Spring Core 2023. 10. 24. 스프링 배치 핵심 도메인 기초 Job 배치 계층 구조에서 가장 상위에 있는 개념으로 하나의 배치 작업 자체를 의미한다. 'A 데이터베이스의 데이터를 B 데이터베이스로 옮기는 배치'는 Job 자체를 의미한다. JobConfiguration을 통해 생성되는 객체 단위, 배치 작업을 어떻게 구성하고 실행할 것인지 전체적으로 설정하고 명세해 놓은 객체 배치 Job을 구성하기 위한 최상위 인터페이스이며 스프링 배치가 기본 구현체를 제공한다. ex SimpleJob, FlowJob 여러 Step을 포함하고 있는 컨테이너로서 반드시 한 개 이상의 Step으로 구성해야 한다. JobInstance Job이 실행될 때 생성되는 Job의 논리적 실행 단위 객체로서 고유하게 식별 가능한 작업 실행을 나타낸다. Job의 설정과 구성은 동일하지만 Job이 .. 개발/Spring Batch 2023. 10. 21. 자바는 Call By Reference가 없다? 오늘은 스터디를 진행하면서 커뮤니티에서 본 자바의 Call By Reference에 대해 정리하려고 한다. 먼저 기본적인 Call by value와 Call by reference에 대해 짚고 넘어가자. Call by value 함수를 호출 할 때 단순히 값을 전달하는 형태의 함수 호출을 의미한다. Call by reference 메모리의 접근에 사용되는 주소 값을 전달하는 함수 호출을 의미한다. 자바는 Call By Reference가 없다? Java에서 primitive type 변수는 실제 값을 저장하는 반면 다른 모든 타입 변수는 참조하는 객체의 주소를 가리키는 참조 변수를 저장한다. 객체의 주소를 가리키는 참조 변수가 스택 메모리에 저장된다. 참조하는 객체는 힙 메모리에 저장된다. 총 2번의 과.. 개발/Java 2023. 8. 2. 낙관적 락, 비관적 락, 네임드 락 JPA는 데이터베이스 트랜잭션 격리 수준을 READ COMMITTED 정도로 가정한다. 만약 일부 로직에 더 높은 격리 수준이 필요하면 낙관적 락과 비관적 락 중 하나를 사용하면 된다. 추가적으로 네임드 락에 대해서도 다시 정리해보겠다. 낙관적 락 (OptimisticLock) 낙관적 락은 이름 그대로 트랜잭션 대부분은 충돌이 발생하지 않는다고 낙관적으로 가정하는 말이다. DB가 제공하는 락 기능을 사용하는 것이 아니라 JPA가 제공하는 버전 관리 기능을 사용한다. 즉 애플리케이션이 제공하는 락이다. 낙관적 락은 트랜잭션을 커밋하기 전까지는 트랜잭션의 충돌을 알 수 없다는 특징이 있다. 충돌이 빈번하지 않을 때 사용하는 것이 좋다. 충돌이 빈번하다면 비관적 락을 사용하는 것이 성능상 이점이 있다. 실패했.. 개발/JPA 2023. 6. 16. Spring Bean으로 등록된 EntityManager 자바 동적 프록시 기술을 알고 읽으시는 게 좋습니다!!! JPA를 처음에 배우면 엔티티 매니저는 여러 스레드가 동시에 접근하므로 스레드 간 공유하면 절대 안된다고 학습한다. 그러나 스프링 부트 애플리케이션을 돌려보면 처음에 엔티티 매니저가 스프링 빈으로 등록되는 것을 확인할 수 있다. '스프링 부트 자동 구성을 통해 엔티티 매니저가 스프링 빈으로 등록, 즉 싱글톤으로 사용이 되는 거 같아' 위와 같은 의문점이 들었고, 이에 관련해서 구글에 찾아보기 시작했다. 결론을 말하면 스프링 빈으로 등록되는 것은 엔티티 매니저 가짜 객체고 실제 애플리케이션에서 로직이 수행될 때 진짜 엔티티 매니저가 사용된다는 것이다. 이러면 쓰레드 세이프하다고 말할 수 있다. 단순히 그렇구나 하고 넘어간 것을 오늘은 눈으로 확인해보.. 개발/JPA 2023. 5. 12. OAuth2 OAuth2 위키피디아의 OAuth 정의는 다음과 같다. 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다. OAuth는 Open Authorization의 약어다. OAuth는 인터넷 프로토콜, 즉 통신을 하기 위한 약속이다. 권한 부여 프레임워크라고 부르는 경우가 많다. 타사 웹 사이트나 웹이 리소스에 접근할 수 있게 허용하는 것이 주 목적이다. 그리고 프로토콜이므로 OAuth2 흐름 정의와 함께 다른 플랫폼, 도구, 언어를 적용할 수 있다. OAuth2는 OAuth보다 업그레이드 된 버전이라고 생각하면 되겠다. OAuth2 인증 아키텍처의 구성 요소.. 개발/Spring Security 2023. 3. 20. 스프링 부트 액츄에이터 액츄에이터 Actuator 스프링 부트가 제공하는 액츄에이터는 지표, 추적, 감사, 모니터링과 같은 프로덕션 준비 기능을 매우 편리하게 사용할 수 있는 다양한 편의 기능을 제공한다. 나아가서 다양한 모니터링 시스템과 매우 쉽게 연동할 수 있는 기능도 제공한다. 액츄에이터 의존성 추가 아래 의존성을 build.gradle에 추가해야지 액츄에이터를 사용할 수 있다. implementation 'org.springframework.boot:spring-boot-starter-actuator' // actuator 추가 액츄에이터 기능 사용 액추에이터를 사용하려면 애플리케이션의 main() 메서드를 실행시키고 /actuator 경로로 접근해야 한다. /actuator 경로를 통해 액츄에이터가 제공하는 수 많은 .. 개발/Spring Boot 2023. 3. 4. 스프링 부트 자동 구성 스프링 부트의 자동 구성 스프링 부트는 자동 구성(Auto Configuration)이라는 기능을 제공해서, DataSource, TransactionManger과 같은 일반적으로 자주 사용하는 수많은 빈들을 자동으로 등록해준다. 자동 구성 덕분에 개발자는 반복적이고 복잡한 빈 등록과 설정을 최소화 하고 애플리케이션 개발을 빠르게 시작할 수 있다. 스프링 부트는 spring-boot-autoconfigure라는 프로젝트 안에서 수 많은 자동 구성을 제공한다. @AutoConfiguration: 자동 구성을 사용하려면 이 애노테이션을 등록해야 한다. 이 애노테이션을 살펴보면 메타 애노테이션으로 @Configuration을 가지고 있으므로 빈을 등록하는 자바 설정 파일로 사용할 수 있다. after의 의미는.. 개발/Spring Boot 2023. 3. 4. 이전 1 2 3 4 5 ··· 12 다음 반응형