목차



1. jenkins란?

2. jenkins 사용이유

3. jenkins 설치방법

4. jenkins 환경설정 및 실행






1. jenkins란?



젠킨스는 Open Source CI (Continuous Integration) Tool로써 여기서 CI 란 팀의 구성원들이 작업한 내용을 정기적으로 통합하는 것을 의미합니다. 말이 약간 어려운데 쉽게 이야기하면 하나의 프로젝트를 여러 명으로 구성된 한 팀이 작업할 때 프로젝트를 리드하는 매니저가 일을 여러가지로 나눠서 팀멤버들한테 분배하고 팀멤버들은 각각 할당된 부분만 작업을 하게 됩니다. 그리고 팀멤버들은 자신이 담당해서 하고 있는 부분의 소스코드를 정기적으로 SVN과 같은 Version Control System에 Submit 하는데 이 각각의 팀멤버들로부터 Submit된 소스코드들을 정기적으로 통합하는 것을 CI라고 하고 이것을 시행해주는 프로그램을 CI tool이라고 합니다.



<1-1. jenkins>



<1-2. jenkins 동작과정>




2. jenkins 사용이유



Jenkins 서버를 사용하는 이유는 현재 진행 중인 프로젝트가 정상적으로 빌드가 되고 있는지를 정기적으로 체크해서 결과를 팀원들한테 알려주고 문제가 발생했을 때 조기에 알려줄 수 있게 해줌으로써 여러 팀 멤버들이 큰 문제없이 각자의 맡은 부분만을 작업할 수 있도록 도와줍니다. 또한 프로젝트 빌드시 자동으로 유닛 테스트와 통합 테스트를 실행해줘서 잘 못된 점이 있으면 알려주고 또한 현재 얼마만큼의 소스코드를 유닛 테스트가 커버하고 있는지 및 어떤 부분에 문제가 있을 수 있는지 등의 정보도 이메일을 통해 알려주거나  SonarQube와 같은 도구를 연동하여 모니터링 할 수 있도록 도와줍니다. 

결과적으로 요약하자면,


1. 프로젝트의 빌드가 정삭적으로 되고 있는지 체크할 때

2. 자동으로 유닛 테스트(Unit Test)와 통합 테스트(Integration Test)의 정기적인 실행과 결과에 문제가 있을 경우에 이메일 또는 SonarQube와 같은 도구       를 통해 결과확인 가능

3. 코드의 질 향상  



<2-1. jenkins의 사용이유>



<2-2. sonarqube 이미지>




3. jenkins 설치방법



 ※젠킨스(Jenkins)를 설치하기 위해 필요한 준비물

   

     - JDK (Java)


     - Web Server(apache tomcat)


     - Build Tool(Maven, Ant)


     - Git, SVN



  3-1. 젠킨스(Jenkins) 다운로드 하기


       - Download link : https://jenkins.io/download/

         

         

<3-1. jenkins 다운로드 목록>


       

  3-2. 설치파일 실행


  

<3-2. 설치파일 실행>




  3-3. jenkins 접속 패스워드


       - 설치 시 자동으로 http://localhost:8080으로 접속



<3-3. http://localhost:8080>





  3-4. initialAdminPassword 경로


       - Administrator password 입력 (C:/Program Files (x86)/Jenkins/secrets/initialAdminPassword)



<3-4. initialAdminPassword파일>




  3-5. initialAdminPassword 오픈


       - 메모장 or 에디터로 파일 오픈 후 비밀번호 복사



<3-5. Administrator password>





  3-6. jenkins 접속


       - Administrator password입력 및 접속


<3-6. Password 입력 및 접속>






  3-7. jenkins URL설정


       - jenkins관리 홈페이지로 사용할 URL설정


<3-7. jenkins URL 설정>






  3-8. Install suggested plugins


       - jenkins 기본 플러그인 다운로드 및 과정


<3-8. jenkins plugin 설치>





<3-9. 플러그인 설치 중>






  3-9. jenkins 계정 생성


       - jenkins Admin User 생성


<3-10. admin User 생성>





  3-10. 최종화면


       - 설치 후 최종 모습


<3-11. 계정생성 후 jenkins 메인화면>







4. jenkins 환경설정 및 실행




  4-1. jenkins관리 -> Global Tool Configuration



<4-1. jenkins 관리>




<4-2. Global Tool Configuration 접속>






  4-2. Global Tool Configuration 설정(JDK)


       - 현재 컴퓨터에 설치되어 있는 JDK가 없다면 Install automatically를 체그하여 원하는 버전을 선택합니다.

     

       - 만약 이미 설치되어 있다면, Install automatically를 해지하고 설정하기 원하는 Name과 JDK의 경로를 입력합니다.



<4-3. JDK설정>





  4-3. Global Tool Configuration 설정(Maven)


       - 현재 컴퓨터에 설치되어 있는 Maven이 없다면 Install automatically를 체그하여 원하는 버전을 선택합니다.


       - 만약 이미 설치되어 있다면, Install automatically를 해지하고 설정하기 원하는 Name과 Maven의 경로를 입력합니다.




<4-4. Maven설정>







  4-4. Deploy to container 플러그인 설치


       - jenkins에서 빌드된 .war파일을 배포하기 위해서 필요한 플러그인 입니다.


       - jenkins관리 -> 플러그인 관리



<4-5. 플러그인 관리>





<4-6. Deploy to container Plugin 설치>






  4-5. jenkins project 생성


       - Freestyle project를 선택하고 project의 이름을 설정하여 생성합니다.



<4-7. jenkins project 생성>






  4-6jenkins project 환경설정


      <General 설정>

     

     - 설명란에 jenkins project의 이름을 설정합니다.



<4-8. jenkins project 설명란 설정>





      <소스 코드 관리 설정>


            - SVN을 사용한다면 Subversion버튼을 체크합니다.


            - Repository URL에는 설치된 SVN의 URL을 작성합니다.


            - Credentials는 해당 SVN에 접속하기 위한 ID와 PW를 미리 설정하여 jenkins가 접속할 수 있도록 합니다.


            - 나머지 설정들은 기본값으로 설정합니다.


<4-9. 소스 코드 관리>





            - Credentials 설정에는 해당 SVN의 ID를 Username에 등록하고, PW를 Password에 등록한 뒤 Credentials의 ID값을 ID에 등록한 뒤 Add버튼을                  클릭합니다.


<4-10. Credentials 설정>






      <빌드 유발 설정>


            - Poll SCM을 선택하여 시간단위로 자동 빌드 및 배포하도록 설정합니다.


            - Schedule에 대한 설명

   

    ※ 15분 간격으로 빌드 작업을 수행

         H/15 * * * *

    ※ 모든 시간의 첫 30분 동안에 10분 간격으로 빌드를 수행

  H(0-29)/10 * * * *

    ※ 주말을 제외한 주중에 9시부터 16시 사이에 2시간에 한번씩 빌드를 수행

  H 9-16/2 * * 1-5

    ※ 12월 달은 제외하고 매달 1일과 15일에 한번씩 빌드를 수행

  H H 1,15 1-11 * 

    ※ 매일 오전 8시에 빌드 수행

  00 08 * * *

    ※ jenkins에서 자동으로 가장 적당한 시간에 빌드

 H H * * *



<4-11. 빌드 유발 설정>






      <빌드 설정>


            - 빌드 설정으로 Invoke top-level Maven targets를 선택합니다.(Maven사용)


            - Global Tool에서 설정한 Maven버전을 선택하여 Maven Version에 적용합니다.


            - Goals는 clean install로 설정합니다.


            - POM에는 자동화 빌드시스템을 적용시킬 프로젝트의 pom.xml의 Path를 적용합니다.



<4-12. 빌드 설정>




            - 빌드 설정으로 Execute Windows batch command를 선택합니다.


            - command라인에 사진과 같이 작성합니다.


            - 톰캣은 앱을 내리더라도 메모리를 해지하지 않는 문제가 있어서 여러 번 앱을 배포하면 메모리 부족 오류가 발생하기 때문에 톰캣의 서버를

              shutdown한 뒤, 다시 startup해야합니다.



<4-13. command 설정>





      <빌드 후 조치 설정>


            - 빌드 후 조치를 설정하기 전에 Tomcat의 manager ID와 PW를 설정해야 합니다.


            - 가장 먼저, apache-tomcat이 설치된 폴더로 에서 conf -> tomcat-users.xml을 찾습니다.



<4-14. tomcat-users.xml Path>



            - tomcat-users파일을 열고 아래그림 <4-14. tomcat-users.xml>와 같이 작성합니다. username과 password는 사용자가 원하는 값으로 설정합니                  다.



<4-15. tomcat-users.xml>



   - tomcat-users.xml의 값을 변경하였다면, 다시 빌드 후 조치 부분으로 넘어와 Credentials에 기존에 설정한 manager ID와 PW를 적용합니다.


            - Tomcat URL부분에는 사용자의 Tomcat IP와 포트번호를 입력합니다.


            - WAR/EAR files에는 jenkins에서 빌드과정을 거친 .war파일 경로를 적용합니다.(보통 **/*.war 로 설정)


            - 모든 값을 입력했다면, 저장버튼을 클릭한 뒤 jenkins item을 사용할 수 있습니다.



<4-16. 빌드 후 조치>





      <jenkins build 성공화면>



<4-17. jenkins 빌드성공>



























http://jinstudio.tistory.com/16


https://lng1982.tistory.com/132


https://m.blog.naver.com/PostView.nhn?blogId=hsm622&logNo=220435833747&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


http://www.nextree.co.kr/p2129/


https://www.slideshare.net/agebreak/140315-ci


http://glqdlt.tistory.com/370


https://www.slideshare.net/sunnykwak90/ss-59330863


https://start.goodtime.co.kr/2013/11/jenkins%EC%97%90%EC%84%9C-tomcat-%EC%9E%AC%EA%B5%AC%EB%8F%99%ED%95%98%EA%B8%B0/


http://www.nextree.co.kr/ciwa-execute-shelleul-iyonghan-jadongbaepo-buteo-seobeo-silhaengggaji/



'STUDY > IT' 카테고리의 다른 글

[IT] 정적분석도구들의 차이점  (0) 2019.01.07
[IT] jenkins란? 개념 및 설치방법(2)  (0) 2019.01.04
[IT] 프론트엔드 공부사이트  (0) 2019.01.02
[IT]자바 공부에 도움이된 사이트  (0) 2018.09.13
[IT]리펙토링이란?  (0) 2018.09.01

영문으로된 홈페이지지만 어렵지않게 공부할 수 있을 것 같습니다.


https://www.w3schools.com/

목차


1. View란?

2. View의 사용방법

  2-1. 단일 테이블을 이용한 단순 View

  2-2. 복합 테입블을 이용한 복합 View

  2-3. WITH CHECK OPTION / WITH READ ONLY 옵션 알아보기

3. View의 장점 및 단점

4. View를 사용하는 이유

5. View에 관한 다른 정보







1. View란?


   뷰의 의미는 하나의 select문과 같다고 생각하면 된다.

   물론 뷰를 통해 insert, update, delete가 가능하지만 대개의 경우는 select를 위해 사용한다. 뷰란 한개 이상의 기본 테이블이나 다른 뷰를 이용하여 생성

   되는 가상 테이블(virtual table)이다.

   뷰는 기존에 생성된 테이블 또는 다른 뷰에서 접근할 수 있는 전체 데이터 중에서 일부만 접근할 수 있도록 제한하기 위한 기법이다.

   뷰를 가상 테이블이라하는 이유는 테이블은 디스크 공간이 할당되어 데이터를 저장할 수 있지만, 뷰는 데이터 딕셔너리 테이블에 뷰에 대한 정의만 저장

   저장하고 디스크에 저장 공간이 할당되지 않는다. 하지만 일반 사용자들은 SQL문을 사용하여 테이블에 저장된 데이터를 검색하고 조작하는 것과 유사하게 뷰를 이용할 수 있다.



- 뷰 자체는 데이터를 갖지 않지만, 기초 테이블의 데이터를 조회하고 수정할 수 있는 창과 같다.

- 뷰는 데이터 값이 아니라 실제적으로는 질의 문장만을 가진다.

- 물리적인 테이블을 근거한 논리적인 테이블

- 뷰는 기본 테이블에서 파생된 객체로서 기본 테이블에 대한 하나의 쿼리문(뷰테이블 X, 뷰쿼리 O)

- 사용자에게 주어진 뷰를 통해서 기본 테이블을 제한적으로 사용하게 된다.



2. View의 사용방법 


   2-1. 단일 테이블을 이용한 단순 View

    

- 하나의 테이블에서 특정한 조건에 맞는 레코드 들만 질의(QUERY)가능





- 하나의 테이블에서 특정한 컬럼들만 질의(QUERY)가능





    2-2. 복합 테입블을 이용한 복합 View


       - 여러 테이블의 칼럼을 모아서(JOIN) 하나의 테이블처럼 질의(QUERY)할 수 있도록 한 데이터베이스 오브젝트      



2-3. WITH CHECK OPTION / WITH READ ONLY 옵션 알아보기


  WITH CHECK OPTION

  • 조건 컬럼값을 변경하지 못하게 하는 옵션이다.

          1. 뷰를 정의하는 서브 쿼리문에 WHERE절을 추가하여 기본 테이블 중 특정 조건에 만족하는 로우(행)만으로 구성된 뷰를 생성할 수 있다.

          2. 이때 WHERE절에 WITH CHECK OPTION을 기술하면 그 조건에 의해 기본 테이블에서 정보가 추출하는 것이므로 조건에 사용 되어진 컬럼 값은

             뷰를 통해서는 변경이 불가능하다.

       

  • 예 1) 뷰를 생성한다.

    SQL> CREATE OR REPLACE VIEW VIEW_CHK30 AS SELECT EMPNO, ENAME, SAL, COMM, DEPTNO FROM EMP_COPY WHERE DEPTNO=30 WITH CHECK OPTION; > SELECT * FROM VIEW_CHK30; 

  • 예 2) 급여가 1200이상인 사원은 20번 부서로 변경한다.

    SQL> UPDATE VIEW_CHK30 SET DEPTNO=20 WHERE SAL>=1200;  뷰를 통해서 일관된 정보를 볼 수 있게 된다.

   



WITH READ ONLY

  • 기본 테이블의 어떤 컬럼에 대해서도 뷰를 통한 내용 수정을 불가능하게 만드는 옵션이다.
  • 예 1) WITH READ ONLY 옵션을 사용한 뷰를 생성한다.

    SQL> CREATE OR REPLACE VIEW VIEW_READ30 AS SELECT EMPNO, ENAME, SAL, COMM, DEPTNO FROM EMP_COPY WHERE DEPTNO=30 WITH READ ONLY;

    SQL> SELECT * FROM VIEW_READ30;  

  • 예 2) WITH READ ONLY 옵션을 기술한 VIEW_READ30뷰의 커미션을 모두 2000으로 변경한다.

    SQL> UPDATE VIEW_READ30 SET COMM=2000; 



3. View의 장점 및 단점


  <장점>

     - DB의 선택적인 부분만 보여주므로 접근을 제한

     - 다양한 접근 경로 설정

     - 복잡한 질의를 단순화

     - 데이터의 독립성 제공

     - 동일한 데이터를 또 다른 뷰로 표현

     - 한 개의 뷰에 여러 테이블의 데이터를 검색 가능

     - 한 개의 테이블로부터 여러 뷰를 생성 가능

  

 <단점>

     - 뷰의 정의를 변경할 수 없고 insert, delete, update에 많은 제한이 있음





4. View를 사용하는 이유


  - 자주 쓰는 쿼리문을 안쓰고 테이블만 조회하면 된다.

  - 보안에 유리하다.

  - 뷰 테이블에 자료가 추가되는 것은 실체 테이블에 반영되지 않기 때문에 주의를 요한다.




5. View에 관한 다른 정보


복합 뷰(Nested View)를 최소화하라
뷰는 엄청난 쿼리를 사용자들로부터 가리는데 훌륭하지만, 하나의 뷰 안에 또 다른 뷰와 내부에 있는 다른 뷰를 (계속해서) 중첩시키다 보면 심각한 성능 저하를 유발할 수 있다. 너무 많은 수의 복합 뷰는 모든 쿼리에 대해 엄청난 양의 데이터가 반환(Return) 되는 결과를 초래해서, 데이터베이스 성능을 말 그대로 기어 다니게 만들 수 있다. 혹은, 더 나가서, 쿼리 최적화기(Optimizer)가 포기해서 아무것도 반환되지 않을 수도 있다.

복합 뷰를 풀어내는 것으로 쿼리 응답 시간을 몇 분에서 몇 초로 줄일 수 있다.





출처 : https://wikidocs.net/4178

        

        http://sjs0270.tistory.com/54


        http://www.itworld.co.kr/tags/2665/SQL/105792


'STUDY > DB' 카테고리의 다른 글

[DB] Oracle SQL 튜닝 및 응용 - 2  (0) 2019.10.29
[DB] Oracle SQL 튜닝 및 응용 - 1  (0) 2019.10.28
[DB] SQL학습 사이트  (0) 2019.01.02
[DB]SQL 공부하기 좋은 사이트  (0) 2018.10.10
[DB]트랜잭션 이란 ??  (0) 2018.09.13

https://wikidocs.net/4177



DB기초 책


SQL 기본 및 활용.pdf


'STUDY > DB' 카테고리의 다른 글

[DB] Oracle SQL 튜닝 및 응용 - 2  (0) 2019.10.29
[DB] Oracle SQL 튜닝 및 응용 - 1  (0) 2019.10.28
[DB] View란?  (0) 2019.01.02
[DB]SQL 공부하기 좋은 사이트  (0) 2018.10.10
[DB]트랜잭션 이란 ??  (0) 2018.09.13

시간날때 무조건 읽어봐야하는 글.


좋은 코드를 작성하기 위해 필수인듯


https://engineering.huiseoul.com/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%91%EB%8F%99%ED%95%98%EB%8A%94%EA%B0%80-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-4%EA%B0%80%EC%A7%80-%ED%9D%94%ED%95%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98-%EB%8C%80%EC%B2%98%EB%B2%95-5b0d217d788d

이것때문에 많은 시간을 허비한게 생각나네요. 정말 간단하면서도 좋은방법이 있습니다.


자바의 현재 시간을 표시해주는 내부함수를 js파일주소 뒤에 붙여주면 해결됩니다.


예를들어, 아래 코드처럼 js파일을 적용시키면 바로바로 js파일이 적용이 안되거나 전혀 안될때가 있습니다. 


<script src="js/Naver_Map/Map.js"></script>


이러한 오류를 고치기위해 아래와 같은 소스로 변경해주면 됩니다.


<script src="js/Naver_Map/Map.js?t=<%=System.currentTimeMillis() %>"></script>


경로 뒷부분에 ?t=<%System.currentTimeMillis()%> 부분만 추가해주면 됩니다.


http://zzznara2.tistory.com/689



----------------------------------------------------------------------------------------------------------------------------------------------------------------


추가.


js파일뿐만 아니라 css파일역시 바로 적용되지 않을 수 있습니다. 이럴때는 시스템 시간을 변경시키는 방법보다


간단하게 버전을 변경해서 반영하는 방법이 있습니다. 이러한 방법을 적용시키는 방법은


위의 js파일을 예로들면,


<script src="js/Naver_Map/Map.js?var=1"></script>


와 같이 ?var='값' 을 넣어주면 됩니다.


자세한 내용은 아래 링크로 첨부하겠습니다.


http://kanu.tistory.com/30

자바스크립트 뿐만 아니라, 다양한 언어들에 대한 요약정리가 잘 되어있는 것 같습니다.


아직 다 보진 않았지만 공부에 도움이 될만한 것 같아 링크를 남깁니다.


http://tcpschool.com/javascript/js_datatype_basic

면접전이나 모르는 문법이 있을경우 참고하기 좋은 사이트


https://wikidocs.net/3914

'STUDY > DB' 카테고리의 다른 글

[DB] Oracle SQL 튜닝 및 응용 - 2  (0) 2019.10.29
[DB] Oracle SQL 튜닝 및 응용 - 1  (0) 2019.10.28
[DB] View란?  (0) 2019.01.02
[DB] SQL학습 사이트  (0) 2019.01.02
[DB]트랜잭션 이란 ??  (0) 2018.09.13

이메일 인증하기


계정 설정

Post Sample Image

1 . 위에서 보이는 이미지 처럼 보안수준이 낮은 앱 허용 을 해준다.

2 . 필요한 라이브러리 추가 ( pom.xml )

<!-- mail -->
<dependency>
	<groupId>javax.mail</groupId>
	<artifactId>mail</artifactId>
	<version>1.4.7</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>${org.springframework-version}</version>
</dependency>

3 . MailHandler를 만들어 준다.

package com.almom.common;

import java.io.UnsupportedEncodingException;

import javax.activation.DataSource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

public class MailHandler {

    private JavaMailSender mailSender;
    private MimeMessage message;
    private MimeMessageHelper messageHelper;

    public MailHandler(JavaMailSender mailSender) throws MessagingException {
        this.mailSender = mailSender;
        message = this.mailSender.createMimeMessage();
        messageHelper = new MimeMessageHelper(message, true, "UTF-8");
    }

    public void setSubject(String subject) throws MessagingException {
        messageHelper.setSubject(subject);
    }
    public void setText(String htmlContent) throws MessagingException {
        messageHelper.setText(htmlContent, true);
    }
    public void setFrom(String email, String name) throws UnsupportedEncodingException, MessagingException {
        messageHelper.setFrom(email, name);
    }
    public void setTo(String email) throws MessagingException {
        messageHelper.setTo(email);
    }
    public void addInline(String contentId, DataSource dataSource) throws MessagingException {
        messageHelper.addInline(contentId, dataSource);
    }
    public void send() {
        mailSender.send(message);
    }

}

4 . TempKey 작성 : 인증키를 생성해줄 것이다.

package com.almom.common;

import java.util.Random;

public class TempKey {

    private boolean lowerCheck;
    private int size;

    public String getKey(int size, boolean lowerCheck) {
        this.size = size;
        this.lowerCheck = lowerCheck;
        return init();
    }

    private String init() {
        Random ran = new Random();
        StringBuffer sb = new StringBuffer();
        int num = 0;
        do {
            num = ran.nextInt(75)+48;
            if((num>=48 && num<=57) || (num>=65 && num<=90) || (num>=97 && num<=122)) {
                sb.append((char)num);
            }else {
                continue;
            }
        } while (sb.length() < size);
        if(lowerCheck) {
            return sb.toString().toLowerCase();
        }
        return sb.toString();
    }

}

5 . root-context.xml 에 host 이메일 주소를 설정해준다.

<!-- 메일 보내기 -->
	<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
		<property name="host" value="smtp.gmail.com" />
		<property name="port" value="587" />
		<property name="username" value="메일" />
		<property name="password" value="비번" />


	<!-- email 요청시는 SMTP -->
		<property name="javaMailProperties">
			<props>
				<prop key="mail.transport.protocol">smtp</prop>
				<prop key="mail.smtp.auth">true</prop>
				<prop key="mail.smtp.starttls.enable">true</prop>
				<prop key="mail.debug">true</prop>
			</props>
		</property>
	</bean>

6 . Controller 작성 : 회원 가입시 이메일 인증코드를 생성한다. 이 인증 코드는 후에 다른 컨트롤러에서 처리를 받아 회원 상태를 활성화 시킬 것이다. (/register 로 매핑되는 컨트롤러에서 등록한 ID는 authStatus[로그인 가능 유 무] 가 활성화 되지 않은 상태)

@RequestMapping(value = "/register", method = RequestMethod.POST)
public String RegisterPost(UserVO user, Model model, RedirectAttributes rttr, HttpServletRequest request, HttpSession session) throws Exception {
	logger.info("회원가입...");
	logger.info(user.toString());
	service.create(user);
	rttr.addFlashAttribute("authmsg" , "가입시 사용한 이메일로 인증해주 3");
	return "redirect:/";
}

7 . Service 작성 : 트랜잭션 컨트롤을 위해 root-context.xml 에 아래 코드 추가를 할 필요가 있다. (namespace 에 tx가 체크가 안되있을 경우 체크하고 maven update할 것) 병행제어를 하는 이유는 연쇄적인 복귀나 모순성 갱신내용 손실을 막기 위함이다. @Transactional 애너테이션을 활용하여 간단하게 하나의 서비스 내에서 두개의 DAO 를 처리한다.

<bean id = "transactionManager" class ="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name = "dataSource" ref = "dataSource"></property>
</bean>
<tx:annotation-driven/>
@Inject
private JavaMailSender mailSender;


@Transactional
@Override
public void create(UserVO vo) throws Exception {
dao.insertUser(vo); // 회원가입 DAO

String key = new TempKey().getKey(50, false); // 인증키 생성

dao.createAuthKey(vo.getUser_email(), key); // 인증키 DB저장

MailHandler sendMail = new MailHandler(mailSender);
sendMail.setSubject("[ALMOM 서비스 이메일 인증]");
sendMail.setText(
		new StringBuffer().append("<h1>메일인증</h1>").append("<a href='http://localhost/user/emailConfirm?user_email=").append(vo.getUser_email()).append("&key=").append(key).append("' target='_blenk'>이메일 인증 확인</a>").toString());
sendMail.setFrom("호스트 이메일 아이디", "알몸개발자");
sendMail.setTo(vo.getUser_email());
sendMail.send();
}

8 . DAO 생성 : 아래에는 mapper 이다.

@Override
public void insertUser(UserVO vo) throws Exception {
	// TODO Auto-generated method stub

	logger.info("dao "+vo);
	System.out.println("DAO 로그 : 회원가입 중");
	sqlSession.insert(namespace +".insertUser", vo);
//		System.out.println(vo.toString());
}

@Override
public void createAuthKey(String user_email, String user_authCode) throws Exception {
	// TODO Auto-generated method stub
	UserVO vo = new UserVO();
	vo.setUser_authCode(user_authCode);
	vo.setUser_email(user_email);

	sqlSession.selectOne(namespace + ".createAuthKey", vo);
}
<insert id = "insertUser">
insert into USER (user_email, user_password, user_name, user_snsId, user_sex, user_phoneNumber, user_birth)
values(#{user_email}, #{user_password}, #{user_name}, #{user_snsId} , #{user_sex}, #{user_phoneNumber}, #{user_birth})
</insert>

<update id="createAuthKey">
update USER set user_authCode = #{user_authCode} where user_email = #{user_email}
</update>

9 . 현재 까지 절차로 회원가입을 하게되면 DB에 회원정보는 저장되지만 user_authStatus 컬럼은 활성화 상태가 되지 않았다. 이를 활성화 시켜주기 위한 이메일 인증작업이 필요하다. 현재까지의 작업으로 회원가입할 때 사용한 이메일로 인증요청이 발송되었다.

10 . 사용자가 인증을 확인하였을 때 서버에서 요청받을 컨트롤러를 생성해준다.

@RequestMapping(value = "/emailConfirm", method = RequestMethod.GET)
public String emailConfirm(String user_email, Model model) throws Exception { // 이메일인증
	service.userAuth(user_email);
	model.addAttribute("user_email", user_email);

	return "/user/emailConfirm";
}

11 . 서비스 생성

	@Override
	public void userAuth(String userEmail) throws Exception {
		dao.userAuth(userEmail);
	}

12 . DAO 생성

@Override
public void userAuth(String user_email) throws Exception {
	// TODO Auto-generated method stub
	sqlSession.update(namespace + ".userAuth", user_email);
}

13 . jsp 생성

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<script type="text/javascript">
		var userEmail = '${user_email}';

		alert(userEmail + '님 회원가입을 축하합니다. 이제 로그인이 가능 합니다.');

		window.open('', '_self', ''); // 브라우저창 닫기
		/* window.close(); // 브라우저 창 닫기 */
		self.location = '/';
		</script>
</body>
</html>


정말 많이 도움을 받은 사이트이다. 좋은자료 잘 쓰겠습니다.


https://shj7242.github.io/2017/12/04/Spring28/


http://songc92.tistory.com/45

+ Recent posts