Day85 실습프로젝트(NCP)
User 프로필 만들기
1. upload
1) form.jsp 수정
form.jsp
에서 유저 프로필을 등록할 HTML을 작성한다.1 2 3 4 5
//encording type을 multipartfh 수정한다. <form action='add' method="post" enctype="multipart/form-data"> //첨부파일을 받을 file타입을 선언한다. 첨부파일: <input name="files" type="file" multiple><br>
2) User 클래스 수정
user의 프로필을 파일명을 저장할 String 변수를 추가한다.
1 2 3 4 5 6 7 8 9 10 11
//파일명을 저장할 String private String photo; //Setter Getter 추가 public String getPhoto() { return photo; } public void setPhoto(String photo) { this.photo = photo; }
3) sql table 생성 및 Mapper 수정
객체에 저장한 String photo를 sql의 서버에 저장한다.
alter table myapp_users add column photo varchar(100);
UserDaoMapper.xml
파일에서 UserMap과 insert를 수정한다.1 2 3 4 5 6 7 8
<resultMap id="UserMap" type="user"> <result column="photo" property="photo"/> </resultMap> <insert id="insert" parameterType="user"> insert into myapp_users(name, email, pwd, tel, photo) values (#{name}, #{email}, sha1(#{password}), #{tel}, #{photo}) </insert>
4) userController.add() 수정
userController.add
에서 HTTP에서 보낸 파일데이터를 받아 inputStream과 contentType을 설정한다.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
@PostMapping("/user/add") public String add(User user, MultipartFile file) throws Exception { // 클라이언트가 보낸 파일을 저장할 때 다른 파일 이름과 충돌나지 않도록 임의의 새 파일 이름을 생성한다. String filename = UUID.randomUUID().toString(); HashMap<String, Object> options = new HashMap<>(); options.put(StorageService.CONTENT_TYPE, file.getContentType()); storageService.upload(folderName + filename, file.getInputStream(), options); user.setPhoto(filename); // DB에 저장할 사진 파일 이름 설정 userService.add(user); return "redirect:list"; }
2. View
1) view.jsp 수정
- ObjectStorage Server에서 img파일의 링크 주소를 가져온다.
Storage에 저장된 파일명은 sql에 저장된 파일명과 같기 때문에 sql파일명을 주소를 붙인다.
1
<img src="https://hnyaqbvk4944.edge.naverncp.com/pgwQ1WDpv2/user/${user.photo == null ? 'default.png' : user.photo}?type=f&w=100&h=100">
2) Mapper 수정
Mapper파일에서 findBy를 통해 User객체에 저장한다.
1 2 3 4 5 6 7 8 9 10 11 12
<select id="findBy" resultMap="UserMap" parameterType="int"> select user_id, name, email, tel, photo from myapp_users where user_id=#{no} </select>
3. delete
1) 기존 사진제거의 문제점
2) 해결방안
3) Transjaction Propagation
- 트랜잭션 전파 정책에 따라 설정 할 수 있다.
Propgation \ Caller | X | 0(Tx1) |
---|---|---|
REQUIRED(디폴트) | Tx1 | Tx1 |
REQUIES_NEW | Tx1 | Tx2 |
MANDATORY | 예외 | Tx1 |
SUPPORTS | none | Tx1 |
NOT_SUPPORTED | 실행 | 현재 트랜잭션을 중지한 상태로 실행 |
NEVER | 실행 | 예외 |
- REQUIRED : 기존에 아무것도 없다면 트랜잭션을 새로만들고 이미 실행하고 있다면 기존에 있는것과 합쳐진다
- REQUIES_NEW : 기존에 없으면 트랜잭션을 새로 만드는데 기존에 무언가가 있가면 다른 트랜잭션으로 새로 만든다
- MANDATORY : 트랜잭션이 없으면 예외를 발생시키고 없으면 트랜잭션을 하나 만든다
- SUPPORTS : 트랜잭션이 없으면 none이다(묶이지 않는다) 없으면 트랜잭션을 하나 만든다
- NOT_SUPPORTED : 트랜잭션이 없으면 그냥 실행 있으면 현재 트랜잭션을 중지한 상태로 실행한다
- NEVER : 트랜잭션이 만약에 없으면 정상으로 실행되고 트랜잭션이 있으면 예외로 처리한다
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.