일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- spring 쇼핑몰
- 스프링 파일 삭제
- 쇼핑몰 프로젝트
- oracle 설치방법
- 스프링 메일 전송
- 스프링 프로젝트
- 스프링 쇼핑몰
- 스프링 업로드
- 스프링 프로젝트 기본 설정
- 스프링 이미지
- 스프링 프로젝트 설정
- 파일 업로드
- spring 프로젝트
- 스프링 게시판 구현
- 스프링 쇼핑몰 프로젝트
- 로그인 기능
- arraylist
- 회원가입 기능
- Bcrypt
- 쇼핑몰 포트폴리오
- 인증번호 전송
- ResponseEntity
- 스프링 포트폴리오
- 스프링 게시판
- BCrypt 적용
- 스프링 HikariCP
- 삭제 구현
- 이미지 출력
- 로그아웃 기능 구현
- 정규표현식
- Today
- Total
Kim VamPa
[Spring][쇼핑몰 프로젝트][27] 업로드 이미지 정보 등록 - 1 본문
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188
목표
업로드 이미지 정보 DB 등록
업로드한 이미지 정보를 상품 등록과정에서 함께 DB에 등록되도록 구현을 목표로 합니다.
순서
1. 테이블 생성
2. BookVO
3. <input> 태그 추가
4. 테스트
1. 테이블 생성
이미지 업로드로 인해 생성된 이미지에 대한 정보(uuid, uploadPath, fileName)를 DB에 등록할 수 있도록 테이블을 생성할 것입니다. 테이블을 생성하기 앞서 이미지 정보를 등록하는 방식에 대해 간단히 생각해보겠습니다. 등록하고자 하는 이미지에 대한 정보는 상품에 대한 이미지 정보입니다. 그리고 현재 우리는 하나의 상품에 하나의 이미지만 추가할 것입니다. 그렇기 때문에 상품 테이블(vam_book)에 이미지에 대한 정보(uuid, uploadPath, fileName)를 칼럼(Column)으로 추가해주어도 상관을 없습니다.
그런데 우리는 뷰에서는 하나의 이미지만 등록 할 수 있도록 코드를 구성하였지만, 서버 단계에서는 여러 개의 이미지를 전달받더라도 처리할 수 있도록 코드를 구성하고 있습니다. 따라서 DB 등록 또한 여러 개의 이미지 정보를 등록할 수 있도록 구성을 해주어야 하는데 상품 테이블(vam_book)에 이미지 정보 컬럼(Column)이 있다면 하나의 이미지 정보밖에 처리할 수 없을 것입니다.
따라서 이미지 정보를 따로 관리 할 수 있도록 새로운 테이블을 만들어 줄 것입니다. 이 테이블에 저장될 이미지 정보는 상품 정보에 대한 이미지 정보이기 때문에 bookId라는 컬럼(Column)을 추가하여 해당 컬럼은 오직 상품 테이블(vam_book)의 상품Id(bookId)에 존재하는 데이터만 등록할 수 있도록 외래키(foreign key)를 통해 제약사항을 추가할 것입니다.
DB에 아래의 명령을 통해서 상품 이미지 테이블(goods_image)을 생성합니다. 기본키(Primary Key)는 uuid로 지정을 하였고 bookId 컬럼은 vam_book 테이블에 존재하는 bookId 값만 등록할 수 있도록 외래키(Foreign Key)를 지정해주었습니다.
-- MySQL
create table vam_image(
bookId int ,
fileName varchar(100) not null,
uploadPath varchar(200) not null,
uuid varchar(100)not null ,
primary key (uuid),
foreign key (bookId) references vam_book(bookId)
);
--Oracle
create table vam_image(
bookId int ,
fileName varchar2(100) not null,
uploadPath varchar2(200) not null,
uuid varchar2(100)not null ,
primary key (uuid),
foreign key (bookId) references vam_book(bookId)
);
2. BookVO
서버의 url 매핑 메서드에서 뷰에서 전송하는 이미지에 대한 정보를 전달 받을 수 있도록 작업해주고자 합니다. 지금 현재의 상품 등록 url 매핑 메서드("/admin/goodsEnroll")의 경우 BookVO 객체 파라미터를 통해서 데이터를 전달받고 있습니다.
상품 이미지에 대한 정보를 BookVO 객체에 포함시켜서 전달 받을 수 있도록 BookVO 클래스를 일부 수정해주고자 합니다.
오직 한개의 이미지에 대한 정보만 전달받는다면 아래와 같이 이미지 정보를 변수를 단순히 추가 선언만 해주면 됩니다.
/* 경로 */
private String uploadPath;
/* uuid */
private String uuid;
/* 파일 이름 */
private String fileName;
혹은 위의 멤버변수를 가진 AttachImageVO 클래스 타입의 변수를 선언해주면 될 것입니다.
private AttachImageVO imageVO;
하지만 현재 우리는 서버 단계에서는 여러개의 이미지를 처리할 수 있는 메서드를 작성하고 있기습니다. 따라서 위와 같은 방식의 BookVO 클래스로는 여러 개의 이미지 정보를 전달받을 수 없습니다.
BookVO클래스가 여러개의 이미지 정보를 담을 수 있도록 List 자료구조를 활용할 것입니다. List의 요소로 AttachImageVO 타입만 가질 수 있는 List 타입의 변수를 선언합니다.
/* 이미지 정보 */
private List<AttachImageVO> imageList;
추가한 imageList 변수의 getter/setter 메서드를 추가해주고 기존의 toString 메서드를 지우고 imageList 변수를 포함시킨 toString 메서드를 추가해줍니다.
3. <input>태그 추가
서버에서 이미지에 대한 정보를 전달받을 준비는 되었습니다. 이제는 뷰 단계에서 이미지에 대한 정보를 전송할 수 있도록 <input> 태그를 추가해주어야 합니다.
<input>태그를 추가하기 앞서서 생각해볼 점 혹은 주의할 점 세 가지가 있습니다.
첫 번째, 이미지 정보에 대한 <input> 태그는 Javascript를 통해 동적으로 추가되어야 한다는 점입니다. 왜냐하면 이미지가 등록되었을 때에만 서버에 이미지에 대한 정보를 전달해주어야 하기 때문입니다.
두 번째, 동적으로 <input>태그를 추가해준다면 어느 시점에 추가해주어야 하는지입니다. 저는 <input> 태그를 추가하기 위한 두 가지 시점이 있다고 생각합니다. 한 시점은 이미지를 등록 후 미리 보기 태그가 추가될 때입니다 (ajax의 succes 속성 동작 시점). 다른 하나의 시점은 상품 등록 페이지 버튼을 눌렀을 때 서버에 데이터가 전송되기 전 이미지 관련 <input> 태그를 추가하는 것입니다.
여러개의 이미지 정보를 전달해주어야 할 경우는 상품 등록 페이지 버튼을 눌렀을 때의 <input> 태그를 추가해주는 것이 용이합니다. 그 이유는 세 번째 고려사항과 관련이 있습니다.
세 번째, <input>태그의 name 속성 값을 어떠한 값을 작성하느냐입니다.
기존의 name 속성값들은 BookVO의 멤버 변수명을 그대로 작성해주면 되었습니다. 기존의 변수들은 값 자체를 저장하는 기본형 타입(Primitive type)이었기 때문입니다. 하지만 이미지 정보의 경우 객체의 주소 값을 가지는 참조 변수(Reference Type)이어서, Java에서 특정 클래스의 멤버 변수에 접근할 때 작성하는 방식 "참조변수명.멤버변수명" 으로 작성을 해주어야 합니다.
예를 들어 BookVO에 'private AttahImageVO imageVO; 변수를 선언했다고 가정하고, 파일 이름(fileName)을 전달 하기 위해선 <input> 태그의 name 속성 값은 "imaegVO.fileName"으로 작성을 해주어야 합니다.
한발 더 나아가 현재 우리는 List 타입의 참조 변수에 이미지 정보를 전달해야 하는데, 이러한 경우 배열에 접근하는 방식과 같이 인덱스(index)를 활용하여 전달하면 됩니다. 예를 들어 하나의 이미지에 대한 정보중 파일 이름(fileName)을 전달해주기 위해서 <input> 태그의 name 속성 값은 "attachList[0].fileName"을 작성해주면 됩니다.
전달해야 할 이미지가 만약 n 개라면 n개만큼의 <input> 태그가 존재해야 하고 각 <input> 태그의 name 속성 값은 "attachList[0].fileName" , "attachList[1].fileName" ... "attachList[n-1].fileName" 이어야 할 것입니다.
앞서 두 번째 고려사항에서 여러 개의 이미지를 전달할 시에 '상품 등록 버튼을 눌렀을 때' <input> 태그를 추가하는 것이 용이하다 한 이유는가 이러한 인덱스(index)를 활용하여 name 속성 값을 작성해야 하기 때문입니다. '상품 등록 버튼'을 누른다는 것은 등록할 이미지가 확정이 된 상태이기 때문에 등록된 이미지 개수만큼 for문을 통해 인덱스(index)를 지정해주면 되어서, 이미지 등록 시점에 인덱스(index)를 지정해 주는 것보다 용이합니다.
상품 등록 페이지(goodsEnroll.jsp), 즉 뷰 단계에서는 하나의 이미지 파일만 등록할 수 있도록 구현하고 있기 때문에 이미지가 등록된 시점에 이미지 정보 <input> 태그가 추가되도록 작업하겠습니다.
이미지 출력 메서드(showUploadImage()) 구현부에 있는 태그를 저장하는 'str' 변수에 이미지 정보를 담는 <input> 태그 문자열 값들이 추가될 수 있도록 아래와 같이 코드를 추가해줍니다.
str += "<input type='hidden' name='imageList[0].fileName' value='"+ obj.fileName +"'>";
str += "<input type='hidden' name='imageList[0].uuid' value='"+ obj.uuid +"'>";
str += "<input type='hidden' name='imageList[0].uploadPath' value='"+ obj.uploadPath +"'>";
4. 테스트
서버로 이미지 관련 데이터가 전달이 되는지 테스트해보겠습니다. 목적이 뷰에서 서버로의 데이터 전달 확인이기 때문에 상품 등록을 요청하는 Service 메서드를 호출 코드를 잠시 추석 처리하여 테스트합니다.
REFERENCE
- 코드로배우는 스프링 웹 프로젝트(남가람북스)
DATE
- 2020.06.03
'스프링 프레임워크 > 쇼핑몰 프로젝트' 카테고리의 다른 글
[Spring][쇼핑몰 프로젝트][27] 업로드 이미지 정보 등록 - 3 (4) | 2021.06.09 |
---|---|
[Spring][쇼핑몰 프로젝트][27] 업로드 이미지 정보 등록 - 2 (6) | 2021.06.08 |
[Spring][쇼핑몰 프로젝트][26] 업로드 이미지 삭제 - 2 (2) | 2021.06.02 |
[Spring][쇼핑몰 프로젝트][26] 업로드 이미지 삭제 - 1 (2) | 2021.05.31 |
[Spring][쇼핑몰 프로젝트][25] 업로드 이미지 출력 -2 (1) | 2021.05.25 |