차근차근 개발자 되기

Spring

96일차: Spring 댓글 게시판(수정, 삭제) / 이메일 인증 / 회원 관리_2021.11.03

wellow 2021. 11. 3. 22:57

 

목차

1.      Spring 댓글 게시판: 수정, 삭제

2.      네이버 서버로 이메일 인증

3.      Spring 회원 관리

 

 

1. Spring 댓글 게시판: 수정, 삭제   

 

- 댓글 게시판도 일반 게시판과 마찬가지로 수정과 삭제를 할 때 글의 번호 값과 페이지 값을 가지고 넘어간다.

- 서비스 클래스에서 out 객체로 메시지를 출력하려면, 컨트롤러에서 메소드를 호출할 때 매개변수에 response 객체를 전달해야 한다.

 

2. 네이버 서버로 이메일 인증  

 

1) 메일 서버

- 직접 메일 서버를 구축해서 사용하기가 어렵기 때문에 네이버나 구글과 같은 사이트에서 제공하는 서버를 이용할 수 있다.

 

2) Mail Server Protocol

• Mail 송신 : SMTP(Simple Mail Transfer Protocol) - 25번

• Mail 수신 : POP3(Post Office Protocol 3) - 110번

 

3) 네이버 SMTP 환경설정

- 네이버로 로그인 후, 네이버 메일에서 [환경설정] 클릭

- [POP3/IMAP 설정] - [POP3/SMTP 설정] 탭 - [POP3/SMTP 사용: 사용함] - [확인]

- [IMAP/SMTP 설정] 탭 - [IMAP/SMTP 사용: 사용함] - [확인]

 

4) 이메일 관련 라이브러리 추가

- STS 프로그램에서 pom.xml 파일에 이메일 관련 라이브러리 추가하기

 

예시

1
2
3
4
5
6
<!-- EMail -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-email</artifactId>
    <version>1.3.3</version>
</dependency>
cs

 

5) 컨트롤러

- 메일을 보내는 사람의 정보와 받는 사람의 정보를 설정하고 전송한다.

- 인증번호 등을 생성하기 위해서는 random 클래스로 객체를 생성하고 nextInt() 메소드를 사용한다.

- ex) Random random = new Random();

         int a = random.nextInt(100);    // 0 ~ 99까지의 난수 발생

- HtmlEmail : pom.xml에 추가한 commons-email 라이브러리에서 제공하는 클래스

 

3. Spring 회원관리   

 

1) 회원 가입

- 전화번호에서 지역번호는 따로 외부 파일을 만들고 배열로 처리한 다음, include 디렉티브 태그를 이용해서 불러올 수 있다.

 

예시

<뷰 페이지(jsp 파일)>

1
2
3
4
5
6
7
8
9
10
11
12
13
<tr>
  <th>집전화번호</th>
  <td>
  <%@ include file="../../jsp/include/tel_number.jsp"%>    
    <select name="join_tel1" >      
       <c:forEach var="t" items="${tel}" begin="0" end="16">
          <option value="${t}">${t}</option>
       </c:forEach>        
    </select> -
       <input name="join_tel2" id="join_tel2" size="4" maxlength="4" class="input_box" /> -
       <input  name="join_tel3" id="join_tel3" size="4" maxlength="4" class="input_box" />
  </td>
</tr>
cs

 

<불러올 외부 파일(tel_number.jsp)>

1
2
3
4
5
6
7
8
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
   String[] tel={"02","031","032","033","041","042","043","044",
           "051","052","053","054","055","061","062","063","064"};
 
   request.setAttribute("tel",tel);
%>
cs

 

2) 첨부파일

① pom.xml 설정

- 첨부파일 기능을 사용하려면 첨부파일 관련 라이브러리(ex. commons-email)가 pom.xml 파일에 등록되어 있어야 한다.

 

예시

1
2
3
4
5
6
<!-- 첨부 파일 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.2</version>
</dependency>
cs

 

② servlet-context.xml 설정

- 업로드되는 파일의 크기를 제한하는 <bean>을 생성한다.

 

예시

1
2
3
4
<!-- 파일 업로드  설정 -->
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <beans:property name="maxUploadSize" value="10000000"/>    
</beans:bean>    
cs

 

③ Controller 설정

- 첨부파일 기능이 있는 회원가입 폼 또는 게시판 글 작성 폼에서 컨트롤러에 값을 전달할 때, MultipartFile 객체로 받아야 한다.

- MultipartFile 객체로 첨부파일의 파일명과 사이즈(용량)를 구한 다음, 크기와 확장자가 올바른지 검사한다.

- cos 라이브러리와 달리 commons-fileupload 라이브러리는 파일을 직접 업로드 시키는 코드가 필요하다. (ex. mf.transferTo(new File(path + "/" + filename)); )

 

예시

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/* 회원 가입 저장(fileupload) */
    @RequestMapping(value = "/member_join_ok.nhn", method = RequestMethod.POST)
    public String member_join_ok(@RequestParam("join_profile1") MultipartFile mf, 
                                MemberBean member,   // DTO 클래스의 객체를 생성해서 이름 값이 일치하는 값을 setter() 메소드로 객체에 저장
                                 HttpServletRequest request,
                                 Model model) throws Exception {
 
        String filename = mf.getOriginalFilename(); // 첨부파일명
        int size = (int) mf.getSize();              // 첨부파일의 크기 (단위: Byte)
                                                    // getSize() 메소드는 long형으로 값을 돌려주기 때문에 명시적 형변환(다운캐스팅) 필요
        String path = request.getRealPath("upload");
        System.out.println("mf=" + mf);
        System.out.println("filename=" + filename);    // filename="Koala.jpg"
        System.out.println("size=" + size);
        System.out.println("Path=" + path);
        int result=0;
        
        String file[] = new String[2];
//        file = filename.split(".");
//        System.out.println(file.length);
//        System.out.println("file0="+file[0]);
//        System.out.println("file1="+file[1]);
        
        if(filename != ""){     // 첨부파일이 전송된 경우
        
            StringTokenizer st = new StringTokenizer(filename, ".");
            file[0= st.nextToken();         // 파일명 (ex. Koala)
            file[1= st.nextToken();         // 확장자    (ex. jpg)
            
            if(size > 100000){                // 100KB
                result = 1;
                model.addAttribute("result", result);
                
                return "member/uploadResult";
                
            }else if(!file[1].equals("jpg"&&
                     !file[1].equals("gif"&&
                     !file[1].equals("png") ){
                
                result = 2;
                model.addAttribute("result", result);
                
                return "member/uploadResult";
            }
        }
 
        if (size > 0) { // 첨부파일이 전송된 경우
 
            mf.transferTo(new File(path + "/" + filename));    // 첨부파일을 서버측으로 전송시키는 코드
 
        }
 
        String join_tel1 = request.getParameter("join_tel1").trim();
        String join_tel2 = request.getParameter("join_tel2").trim();
        String join_tel3 = request.getParameter("join_tel3").trim();
        String join_tel = join_tel1 + "-" + join_tel2 + "-" + join_tel3;
        
        String join_phone1 = request.getParameter("join_phone1").trim();
        String join_phone2 = request.getParameter("join_phone2").trim();
        String join_phone3 = request.getParameter("join_phone3").trim();
        String join_phone = join_phone1 + "-" + join_phone2 + "-" + join_phone3;
        
        String join_mailid = request.getParameter("join_mailid").trim();
        String join_maildomain = request.getParameter("join_maildomain").trim();
        String join_email = join_mailid + "@" + join_maildomain;
 
        member.setJoin_tel(join_tel);
        member.setJoin_phone(join_phone);
        member.setJoin_email(join_email);
        member.setJoin_profile(filename);
 
        memberService.insertMember(member);
 
        return "redirect:member_login.nhn";
    }
cs

 

④ Mapper 파일 SQL문 설정

- mybatis에서는 원칙적으로 null 값을 허용하지 않기 때문에 첨부파일을 업로드하지 않는 경우 오류가 발생한다. 이것을 방지하려면 sql문에 jdbcType=VARCHAR 코드를 추가해준다.

 

예시

1
2
3
4
5
6
7
8
9
<!-- 회원저장 -->
<insert id="member_join" parameterType="member">
  insert into join_member (join_code,join_id,join_pwd,join_name,
  join_zip1,join_addr1,join_addr2,join_tel,join_phone,join_email,join_profile,
  join_regdate,join_state) values(join_member_joincode_seq.nextval,
  #{join_id},#{join_pwd},#{join_name},
  #{join_zip1},#{join_addr1},#{join_addr2},#{join_tel},
  #{join_phone},#{join_email},#{join_profile,jdbcType=VARCHAR},sysdate,1) <!-- jdbcType=VARCHAR : null 값을 허용 -->
</insert>
cs

*join_profile1은 폼에서 첨부파일 태그의 name 값