[Spring] 이메일 서비스 구현하기

한지연·2023년 11월 4일

🔍 이메일 서비스 구현하기

❗️ SpringBoot를 이용하여 구현하였습니다.

1️⃣ build.gradle에 의존성 추가

	//mail
	implementation 'org.springframework.boot:spring-boot-starter-mail'

2️⃣ yml 파일에 설정 추가

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: ${spring.mail.username}
    password: ${spring.mail.password}
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

3️⃣ 구글 메일 설정

1. 구글 계정 관리에 들어간다.

2. 2단계인증이 되어 있다면 그대로 2단계 인증을 누르고 아니면 설정을 해준다.

3. App의 이름을 정하고 만들기를 누른다.

4. 생성된 비밀번호를 복사한다.


4️⃣ 환경변수 설정하기

1. 사용하는 애플리케이션에 환경변수를 설정하기 위해 edit을 누른다.

2. Modify options를 누르고 Environment variables를 체크한다.

3. 체크한 부분 클릭 후 +를 눌러 yml에서 설정한 ${spring.mail.username}, ${spring.mail.password}를 입력해준다.
username은 아이디를 적으면 되고 password엔 복사해둔 앱 비밀번호를 적으면 된다. 공백은 들어가면 안 되니 없애고 넣어야 한다.


5️⃣ MailService 클래스 생성

@RequiredArgsConstructor
@Slf4j
@Service
public class MailService {

    private final JavaMailSender javaMailSender;

    public void whenEnjoyMeeting(User user, Meeting meeting){

        // 메시지 객체 생성
        SimpleMailMessage message = new SimpleMailMessage();

        // 이메일 제목
        message.setSubject(user.getUsername()+"님 플로깅 모임에 참여하셨습니다!");

        // 이메일 받을 대상
        message.setTo(user.getEmail());

        // 이메일 내용
        message.setText(user.getUsername()+ "님 " +meeting.getTitle()+" 모임에 참여하셨습니다. " +
                "즐거운 모임과 더 나은 지구를 위한 실천을 응원합니다!");

        javaMailSender.send(message);

    }

}

6️⃣ 메일 서비스가 필요한 부분에서 사용하기

나같은 경우는 모임 생성과 모임 참여시에 메일을 발송해주는 로직을 사용했다. controller에서는 service단의 메서드만 호출해주고 중요한 로직은 전부 Service에서 해결하기 때문에 MailService 객체를 MeetingService에서 호출해 사용했다.

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Slf4j
public class MeetingService {

    private final MailService mailService;

    @Transactional
    public Meeting createMeeting(MeetingCreateDto dto) {

        if(dto.getUserId() == null) throw new IllegalArgumentException();

        User user = userRepository.findByUserStrId(dto.getUserId());

        if(user == null) throw new UserNotFoundException("유저 정보가 존재하지 않습니다");

        Meeting meeting = Meeting.builder()
                .user(user)
                .title(dto.getTitle())
                .location(dto.getLocation())
                .period(dto.getPeriod())
                .contents(dto.getContents())
                .maxCount(dto.getMaxCount())
                .build();


        Meeting saveMeeting = meetingRepository.save(meeting);
        chattingRepository.save( new Chatting(saveMeeting));

        log.info("meeting number order: {}", saveMeeting.getId());

		// 메일 서비스
        mailService.whenEnjoyMeeting(user, saveMeeting);


        return saveMeeting;
    }


    @Transactional
    public void enjoyMeeting(Long meetingNo, String userId) {

        User user = userRepository.findByUserStrId(userId);

        boolean continueProcess = meetingRepository.alreadyEnjoyed(user.getId(), meetingNo);

        if(!continueProcess){
            Meeting meeting = meetingRepository.findById(meetingNo).orElseThrow(IllegalArgumentException::new);
            //더티체킹
            meeting.enjoyMeeting(user.getId());
            // 메일 서비스 해주기
            mailService.whenEnjoyMeeting(user, meeting);
        }



        throw new IllegalArgumentException("이미 참여중인 모임입니다.");
    }

}

7️⃣ 테스트 해보기

아주 잘 된다.

profile
배우고 활용하는 것을 즐기는 개발자, 한지연입니다!

0개의 댓글