본문 바로가기

Programming/Spring

(12)
EntityManager란? JPA 를 사용하는데 있어 중요한 개념이다. EntityManager엔티티를 저장하고, 관리하는 1차 캐시 역할을 하는 메모리 공간이다.이 컨텍스트는 EntityManager가 관리하게 되며, 동일 트랜잭션 내에서 동일한 객체를 계속 반환하고 변경사항을 추적하게 된다. 영속성에 대한 특성은 총 4가지가 존재 한다.비영속: 영속성 컨텍스트와 무관한 일반적인 Java객체 new로 생성되는거영속: 영속성 컨텍스트에 주입 또는 관리 em.persist() 이후 상태준영속: 영속화 되었다가 분리된 경우 ( 식별자는 있지만, 영속성 컨텍스트에 없는 객체) em.detach() or em.clear()삭제: 영속성 컨텍스트에서 아예 삭제된 데이터 트랜잭션 커밋 시 DB에서 삭제 em.remove() 여기서 의미하는 ..
Spring 성능 부하 테스트 Thread Pool 저번에 쓴 글에 이어서 이번에는좀 더 성능 오류와 서버가 죽는 문제를 해결해보려고 합니다.  저번 글에서는 서바가 일정 수치를 넘어서게 되면 계속 죽는 것을 그래프를 통해서 확인할 수 있었습니다.그리하여 해당 로직을 처리하는 과정에 Thread Pool 을 추가하여 좀 더 요청에 대해 비동기적으로 처리하여 서버가 죽는 형태를 방지해보려고 합니다. 서버의 오류를 줄이는 대신에 TPS,Executed Tests의 값은 내려갔지만, 서버가 죽지 않고 계속 처리를 할 수 있게 되었습니다.Thread Pool  보통 각 요청 마다 처리할 수 있는 Thread를 생성하여 요청을 처리하게 되는데 이때 발생하는 문제로는 생성하는데 생각보다 많은 시간이 걸리게 됩니다.처리속도 보다 더 빠르게 요청이 늘어난다면 스레드를 ..
nGrinder 부하 테스트 오늘은 제가 진행했던 프로젝트의 성능을 측정하기 위해 네이버에서 개발한 오픈소스를 사용 해보도록 하겠습니다.nGrinder는 Java기반 성능 테스트 도구입니다. 우선 nGrinder를 사용하기 위해서는 docker가 필요합니다.docker pull ngrinder/controller 그 다음에 도커를 실행 하기 위해 다음과 같은 명령어를 입력합니다. docker run -d \ --platform linux/amd64 \ -v ~/ngrinder-controller:/opt/ngrinder-controller \ --name controller \ -p 8081:80 \ -p 16001:16001 \ -p 12000-12009:12000-12009 \ ngrinder/controller A..
[JPA] 랜덤값 가져오기 프로젝트를 진행 중에 사용자의 테마를 기준으로 랜덤 데이터 값을 가져오는 기능을 만들어야 했다. 어떻게 구현을 해야 하는지 고민을 해보았다.기본적으로 JPA는 랜덤으로 데이터를 추출하는 기능은 없다고 한다. 그래서 2가지 방법을 기본적으로 사용을 한다고 하는데첫 번째 방식은 페이징 방식이다. import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Pageable;import org.springframework.data.domain.Page;import org.springframework.st..
[Project] Builder 패턴 사용 코드를 짜면서 setter를 사용하는것을 지양해야 한다는 얘기를 들어본적이 있다.하지만 왜 그렇게 짜면 안되는지 그러면 어떻게 사용해야 하는지는 잘 모른다.  그거에 대해서 알아보고 어떻게 작성해야 하는지 알아보겠다. setter 지양1.setter를 사용하면 값을 변경한 의도를 알기 어렵다.2.객체의 일관성을 유지하기 어렵다. setter를 사용하게 되면 외부에서 객체의 내부 상태를 변경 할 수 있으므로 객체의 상태가 언제든지 바뀔 수 있다. 코드의 유지보수를 어렵게 만들 수 있다. 그래서 대안으로 생성자를 통한 주입과 Builder 패턴을 통한 주입이 있다.Builder를 통한 예시를 알아보자우선 생성자보다는 Builder 패턴이 복잡한 객체를 유연하고 가독성 좋게 생성하기 편하다. @Builderp..
Spring Boot JPA를 이용한 수정하기 PUT Spring boot 에서 JPA 를 이용하여 학생 정보를 수정해보도록 하겠습니다. 파일 구성은 이렇게 진행 했고 DB는 mysql을 사용했습니다. 우선 DTO을 구현 합니다. DTO는 Data Transfer Object 의 약자로 로직을 가지지 않는 데이터 객체이고, getter, setter 메소드만 가진 클래스를 의미합니다. package com.Project.demo.DTO; import com.Project.demo.domain.Entity.UserEntity; import com.Project.demo.service.UserService; import lombok.Getter; import lombok.Setter; import org.springframework.stereotype.Serv..
AOP #8.1~#8.2 AOP가 필요한 상황 모든 메소드의 호출 시간을 측정하고 싶다면? 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면? 언제 어떻게 사용하지만 알면 쉽게 잘 할 수 있다. 모든 메소드의 호출 시간을 측정 할 때 우리를 예로 들자면 회원가입을 할 때 시간을 측정 해봐야 합니다. public Long join(Member member){ long start = System.currentTimeMillis(); try{ //같은 이름이 있는 중복 회원 X validateDuplicateMember(member); memberRepository.save(member); return member.getId();..
스프링 DB 접근 기술 #7.3~#7.6 스프링 JdbcTemplate 순수 Jdbc와 동일한 환경설정을 하면 된다. 스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작성해야 한다. package hello.hellospring.repository; import hello.hellospring.domain.Member; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; import java.util.List; import java.util.Option..
스프링 DB 접근 기술 #7.1~#7.3 스프링 데이터 엑세스 H2 데이터베이스 설치 https://www.h2database.com/html/download-archive.html 에 들어가서 1.4.200버젼을 설치한다. 데이터베이스 파일 생성 방법 jdbc:h2:~/test (최초 한번) ~/test.mv.db 파일 생성 확인 이후부터는 jdbc:h2:tcp://localhost/~/test 이렇게 접속 여기서 연결 버튼을 누르고 들어오게되면 이렇게 창이 뜬다. insert into member(name) values(’spring’),insert into member(name) values(’spring2’)을 등록하게 되면 이렇게 나오게된다. 순수 JDBC 환경설정(build.grandle) implementation 'org.spri..
회원 관리 예제 - 웹 MVC 개발 #6.1~#6.3 회원 웹 기능 - 홈 화면 추가 Controller에다가 HomeController 라는 클래스를 만듭니다. package hello.hellospring.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController { @GetMapping("/") public String home(){ return "home"; } } 이렇게 만든 후 resource/templates에다가 home.html를 만들어 줍니다. Hello Spring 회원 기능 회원 가입 회원 목록 회원 웹 기능 ..