토이 프로젝트/Spring&Java 갖고놀기

spring - DB + 메일 서버 + 웹페이지 연동하기(feat. 회원 가입 후 메일 계정 자동 생성)

TerianP 2022. 1. 31.
728x90

오늘은 드디어 정말 하고 싶었던 메일서버와 회원 가입 연동을 시작하겠습니다!! 예전부터 정확히는 메일서버를 만든다는 생각을 했을 때부터 만들고 싶었던 것인데 드디어 성공했습니다ㅎ

 

- 왜 메일 서버인가?

사실 왜 매번 메일 서버와 웹 페이지를 연동하고 싶다고 언급했는지부터 잠깐 이야기하고 넘어가겠습니다. 제가 생각하고 비슷하게나마 구현해보고 싶었던 것은 네이버와 구글입니다. 정확히는 네이버와 구글처럼 웹 사이트 + 검색 기능 + 메일 기능 등을 포함하는 진짜처럼 만들어보고 싶었습니다. 

먼저 검색 기능은 공부하다보니 엘라스틱 서치로 검색 엔진을 구축 할 수 있다고는 하는데...제 능력을 넘어도 한참 넘은 것 같았고, 그나마 할 만한 것이 웹 사이트와 메일 기능을 연동하는 것이었습니다. 사실 메일 기능은 메일 서버 하나만 있으면 되는 것이고, 웹 사이트는 spring 으로 만들면 된다고 생각했기 때문입니다. 물론 네이버나 구글처럼 웹 사이트에서 메일을 보내고 수신/발신을 확인하는 것은 또 번외겠지만 단순하게 회원가입 후 해당 id 와 passwd 로 메일 계정이 짠! 하고 생성된다..라고만 생각했을 때는 솔직히 가장 만만해보였습니다. 무엇보다 기본적으로 만드는 '게시판 만들기' 이런것보다 지금 제 능력을 최대한 발휘해서 조금 특이한 것을 만들어보고 싶었던 것 같네요ㅎ

뭐...만만해보였던 것은 제가 아무것도 몰라서 그랬던 거고ㅠㅠㅠ엄청 어렵더라구요ㅠㅠ여튼 이제 진짜 시작하겠습니다!

 

- 웹 사이트 및 서버 구현 내용 및 구현 방식

  • 웹 사이트 : spring 기반 웹사이트 구현 => 회원 가입, 로그인, 세션 기능
  • 메일 서버 : postfix + dovecot
  • DB : Mysql
    • 회원 가입 관련 DB : hjproject - member
    • 메일 서버 관련 DB : mailbox - virtual_users
  • DB 의 Trigger 기능을 이용하여 회원 가입 후 member 에 회원 가입한 내용이 추가되면 이를 활용하여 virtual_users 에 내용이 추가되도록 함
  • 아래 제 git 에 웹사이트와 이번 trigger 내용을 포함해두었습니다.

https://github.com/SeJonJ/My_Web.git

 

GitHub - SeJonJ/My_Web: Spring 을 통한 웹 개발

Spring 을 통한 웹 개발. Contribute to SeJonJ/My_Web development by creating an account on GitHub.

github.com

 

1. 메일 서버 구축 및 MySQL DB 연동

- 관련 설명 글

https://terianp.tistory.com/7?category=930649 

 

메일 서버 구축하기 dovecot, postfix - (2) SSL 인증서 생성 & postfix 설치 및 설정

이번에는 잡설 없이 빠르게 시작하겠습니다! 구축 순서 1. SSL 인증서 생성 2. postfix 설치 및 설정 : 각종 파일 설정 , SSL 인증서 설정 3. dovecot 설치 및 설정  : 각종 파일 설정 , SSL 인증서 설정 4. 유

terianp.tistory.com

 

- 메일 서버 설정 git 파일

https://github.com/SeJonJ/MailServerConfig.git

 

GitHub - SeJonJ/MailServerConfig: Dovecot + Postfix + Mysql 연동

Dovecot + Postfix + Mysql 연동. Contribute to SeJonJ/MailServerConfig development by creating an account on GitHub.

github.com

 

2. 메일 서버와 회원 가입 연동을 위한 Trigger

- Trigger 란?

Trigger 를 어떻게 작성하였는가를 적기 전에 Trigger 가 어떤 기능을 하는가 에 대해서 설명해야 할 것 같습니다.

DB 를 사용하기 위한 SQL에는 CRUD 즉 create - insert  - 생성, read - select - 읽기, update - update - 갱신 , delete - delete - 삭제 로 대표되는 기본적인 기능이 있습니다(이 부분은 공부할 겸 따로 글을 작성하겠습니다)

그리고 SQL 에는 추가적으로 지원하는 Trigger 트리거 와 procedure 프로시저 라는 기능이 있습니다.

 

두 가지는 서로 비슷하지만 다른 기능을 합니다. 자세한 것은 나중에 적어두기로 하고 여기서는 일단 간단하게 프로시저란 미리 저장해놓은 SQL 작업을 수행하는 것이고, 트리거는 DB에서 삽입, 갱신, 삭제 등 이벤트가 발생할때 마다 자동 수행되는 절차형 SQL 이라고 합니다.

 

프로시저는 뭔가 자바의 메서드처럼 만들어두었다가 '호출 후 실행' 하는 느낌이라면 트리거는 IF 문처럼 특정한 이벤트가 발생할때 trigger(IF문) 안의 내용이 실행된다 라고 생각하면 될 것 같습니다.

 

- Trigger 작성

자세한 내용은 주석처리했으니 여기서 NEW.id , NEW.passwd 로 작성된 부분만 설명하면 될 것 같습니다.

앞에 NEW. 가 붙여진 컬럼은 hjproject.member 에 새로 입력되는 칼럼 내용을 의미합니다. 즉 NEW.id , NEW.passwd 는 hjproject.member 에 새로 회원가입 되는 id 와 passwd 가 될 것이고 이를 가져와서 사용한다는 의미입니다.

이때 NEW. 를 붙이는 것 대신 특정한 값을 입력해두면, 해당 값이 입력됩니다.

 

또한 트리거 작성 시 '언제 실행되는지' 에 사용되는 DB 위치에서 trigger 를 작성해주셔야 합니다. 저는 hjproject DB 위치에서 트리거를 넣었습니다.

## Delimiter는 일종의 '구문 문자'로 C나 JAVA의 ';'(세미콜론)라고 한다.
즉, 문법의 끝을 나타내는 역할을 한다. END 후에 delimiter 뒤에 나온 기호를 붙여주자
delimiter //

## 만드는 방법 + 트리거 이름 작성 : create or replace 즉 없으면 새로 만들고, 있으면 대체 
트리거 이름은 new_mailuser
create or replace trigger new_mailuser

## 언제 실행되는지 작성 : [DB명].[table명] 에 insert 된 후 즉, hjproject.member에 내용이 입력된 후
after insert on hjproject.member

## 몇 번이나 실행되는지? : 여기서는 each row 즉 매 행마다(DB에는 내용이 추가되면 한 행이 추가됨)
for each row

## trigger 시작문 : begin 으로 시작
begin

## trigger 로 실행하고 싶은 SQL 구문 : 트리거가 작동하면 아래의 SQL문이 실행됨
## mailbox.virtual_user 에 domain_id 는 1, password 는 NEW.passwd에 기존의 암호화 방식으로, 
email은 NEW.id에 @mail.hjproject.kro.kr 을 붙여서, box 이름은 NEW.id

INSERT INTO mailbox.virtual_users
   (`domain_id`, `password` , `email`, `box`)
VALUES
   ('1', ENCRYPT(NEW.passwd, CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), CONCAT(NEW.id, '@mail.hjproject.kro.kr'), NEW.id);

## 끝날때 쓰는 문장 : END //
END //

 

 - Tigger 확인 / 삭제

아래 명령어를 사용해서 트리거가 제대로 생성되었는지 확인해야합니다.

show triggers; ## 트리거 확인하기
DROP TRIGGER [트리거명]; ## 트리거 삭제하기

 

 

3. 구현 확인하기

- 먼저 회원가입 후 회원가입 된 내용으로 virtual_users 에 입력이 되는지 확인해보겠습니다.

회원 가입
로그인까지 완료

- select * from virtual_users where email = 'mailserver_test@mail.hjproject.kro.kr' 을 입력하여 확인합니다.

제가 입력했던 mailserver_test 로 메일이 생성되었습니다.

 

- 실제로 메일로 로그인해서 수신 발신 테스트를 해보겠습니다.

정보를 입력하고

- 실제 발신 / 수신 테스트 해보겠습니다.

내용을 적고
새로 만들었던 mailserver_test 로 발송을 성공했습니다.
와...성공

 


 

이렇게 해서 드디어!! 완료했습니다. 사실 처음에 Trigger 를 설정하는게 정말 힘든 줄 알았는데, 의외로 생각보다 쉽게 되었던게 다행인 것 같습니다. 이렇게해서 메일 서버와 웹 사이트 연동 완료했습니다. 정확히는 회원가입 후 메일 계정 생성만 되는것이지만 이제는 웹 페이지 상에서 메일 발신 / 수신 기능까지 구현을 목표로 달려보겠습니다!

 


 

 

- 참고 자료

https://keumjae.tistory.com/131

 

[Database] 프로시저와 트리거 차이점

프로시저 vs 트리거 프로시저 저장 프로시저는 미리 데이터베이스 서버에 일련의 SQL 명령을 해 놓고, 프로시저를 실행하여 SQL 명령을 간단하게 실행할 수 있도록 할 수 있다. 프로시저 안에는 SQL

keumjae.tistory.com

 

댓글