포스트

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) 기존 사진제거의 문제점

  • 기존 사진을 제거하는데 파일명이 중복되면 sql 서버에서 다른 사진을 삭제 할 수가 있다.

    image

2) 해결방안

  • 같은 트랜잭션 단위로 묶으면 변경시에 중복을 방지 할 수 있다.

    image

3) Transjaction Propagation

  • 트랜잭션 전파 정책에 따라 설정 할 수 있다.
Propgation \ CallerX0(Tx1)
REQUIRED(디폴트)Tx1Tx1
REQUIES_NEWTx1Tx2
MANDATORY예외Tx1
SUPPORTSnoneTx1
NOT_SUPPORTED실행현재 트랜잭션을 중지한 상태로 실행
NEVER실행예외
  • REQUIRED : 기존에 아무것도 없다면 트랜잭션을 새로만들고 이미 실행하고 있다면 기존에 있는것과 합쳐진다
  • REQUIES_NEW : 기존에 없으면 트랜잭션을 새로 만드는데 기존에 무언가가 있가면 다른 트랜잭션으로 새로 만든다
  • MANDATORY : 트랜잭션이 없으면 예외를 발생시키고 없으면 트랜잭션을 하나 만든다
  • SUPPORTS : 트랜잭션이 없으면 none이다(묶이지 않는다) 없으면 트랜잭션을 하나 만든다
  • NOT_SUPPORTED : 트랜잭션이 없으면 그냥 실행 있으면 현재 트랜잭션을 중지한 상태로 실행한다
  • NEVER : 트랜잭션이 만약에 없으면 정상으로 실행되고 트랜잭션이 있으면 예외로 처리한다
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.