영속성 컨텍스트란 엔티티를 영구 저장하는 환경으로써, 애플리케이션과 데이터베이스 사이에서 엔티티를 관리하는 논리적인 영역이다.
이를 통해 1차 캐시, 동일성 보장, 트랙잭션 지원, 쓰기 지연, 변경 감지, 지연 로딩 등 다양한 기능을 제공하며 영속성 컨텍스트는 한 트랜잭션 단위 ( 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위 - 논리적 단위 ) 에서만 존재했다가 한 트랜잭션이 종료되면 영속성 컨텍스트도 삭제된다.
비영속
Member member = new Member();
객체만 생성한 상태로써 아직 영속성 컨텍스트에 저장하지 않은 상태 - 비영속 ( new / trasient )
영속
em.persist(member);
엔티티 매니저의 persist() 메소드를 사용해 member 객체를 영속성 컨텍스트에 저장한 상태 ( 영속성 컨텍스트에 의해 member 객체가 관리되는 상태 )
준영속
// 특정 엔티티만 준영속 상태로 전환한다.
em.detach(member);
// 영속성 컨텍스트를 완전히 초기화한다.
em.clear();
// 영속성 컨텍스트를 종료한다.
em.close();
JPA 에서 준영속 상태란 이전에 영속 상태에 있던 엔티티 객체가 영속성 컨텍스트에서 분리되어 더 이상 관리되지 않는 상태를 나타낸다.
준영속 상태의 엔티티는 JPA 가 더 이상 추적하거나 관리하지 않는다.
삭제
em.remove(member);
엔티티 인스턴스를 영속성 컨텍스트에서 제거하며 데이터베이스에서 삭제한다.
1차 캐시
영속성 컨텍스트 내부에 캐시를 가지고 있다.
엔티티를 영구 저장하는 환경으로 트랜잭션 단위의 메모리 공간이다.
조회 시, 1차 캐시를 통해 엔티티를 빠르게 찾을 수 있다.
데이터베이스에 접근하지 않고도 엔티티의 동일성을 보장한다.
동일성 보장
1차 캐시를 통해 같은 엔티티를 조회하면 동일한 참조값을 반환한다.
Java 컬렉션처럼 동일한 주소의 값을 가져오는 것과 유사하다.
쓰기 지연
엔티티 매니저의 persist 호출 시 데이터베이스에 저장되지 않고 1차 캐시에 저장된다.
pom.xml 파일에 프로젝트의 버전 변경 >> maven 프로젝트 업데이트 >> 한글 인코딩 작업 실행
이제 파일 업로드, 다운로드에 필요한 라이브러리를 추가할 것임
commons fileupload 라이브러리 추가할 것 >> 1.3.3 버전 >> pom.xml 에 추가
입, 출력을 담당하는 라이브러리 >> 2.4 버전 >> pom.xml 에 추가
class 파일로 bean 객체를 추가
기존에 servlet-context.xml 에서 빈 객체를 등록하던 방식을 클래스 파일에서 어노테이션을 사용해서 등록하여 사용
( 위 xml 파일은 어노테이션을 활용해서 작성하는 방법을 설명하기 위해 작성했으므로 xml 파일 내 빈 객체 등록 부분은 주석처리 하였음 )
파일 업로드 경로 작성 >> uploadForm.jsp 에 업로드 폼 작성 >> 파일 전송 시 이동될 경로 작성
Controller 에도 파일 받아서 처리할 url 경로 작성 및 넘어온 파일을 변수로 담아서 출력해봤음 >> service 쪽으로 받은 파일을 넘겨줌
파일 저장 로직 완성 ( 파일 명 앞에 저장 시간을 년월일시분초 형식으로 붙인 뒤 변수로 저장 경로를 지정하여 저장 )
DB 에 저장한 이미지의 이름을 저장해볼 것임
create table file_image(
id varchar(20) primary key,
name varchar(20),
img_name varchar(100)
);
sql 문 작성 및 실행
▼ DB 연동 작업 ▼
DB 연동에 필요한 라이브러리 추가
root-context.xml 작성
fileMapper.xml 세팅
▲ DB 연동 세팅 완료 ▲
DB 와 연동할 객체 DTO 작성
파일을 저장하지 않으면 DB 에 nan 으로 처리, 파일을 저장한다면 파일 명을 DB 에 저장
FileMapper 인터페이스에 메소드 추가
FileMapper.xml 파일에 sql 문 작성
FileMapper.xml 파일에 namespace 를 설정해주지 않아서 다시 고침
이미지 파일 전송해보니 정상적으로 파일 이름 DB 에 저장되는 모습
파일 저장도 되는 모습
( 현재 테이블에 id 값을 primary key 로 지정해놓아서 동일한 아이디로 파일 업로드를 하면 무결성 조건 에러가 발생되는데 이때, 정상적으로 파일은 디렉토리에 저장되지만 DB 에 파일명을 저장할때 무결성 조건 에러를 만나면서 DB 에 파일명이 저장되지는 않는다,,,, )
파일을 jsp 파일에 출력해볼 것임
경로 생성
Controller 에서 model 객체를 Service 에 전달, Service 에서는 Mapper 를 사용해 데이터를 가져와서 model 에 저장할 것임
FileMapper.xml 에 select 문 작성 ( resultMap 을 사용해서 컬럼명과 변수를 Mapping )
전달받은 데이터를 forEach 문으로 화면에 출력
다운로드와 이미지 출력 구현
download 경로를 컨트롤러에 작성 및 download 기능을 구현
파일 삭제 기능 추가
result.jsp 에 파일 별로 a 삭제할 경로와 파일 출력할 img 태그 추가
delete 경로로 들어왔을때 file 명과 id 값을 받아서 service 로 전달
service 에서는 mapper 로 id 값을 전달하여 db 에 저장된 파일정보를 삭제, 디렉토리 내의 파일은 service 에서 삭제