프로젝트 초기에 리액트가 아직 익숙하지 않을 때 제일 먼저 했던 작업이었던 만큼 코드가 지저분한거같다.

 

          <div className="mb-1 text-sm font-semibold text-gray-800">아이디</div>
          <div className="flex rounded-lg p-2.5 mb-4 bg-white border border-gray-300 focus-within:border-teal-400">
            <input
              className="w-full h-5 text-sm font-normal text-gray-700 border-none outline-none"
              type="text"
              placeholder="아이디 입력 (4자~20자)의 영어와 숫자만 가능"
              value={id}
              onChange={handleId}
            />
          </div>
          <div className="mb-2 text-xs text-red-500">
            {!idValid && id.length > 0 && (
              <div>사용할 수 없는 아이디입니다</div>
            )}
          </div>

 

css 프레임워크는 테일윈드를 사용했고, 처음에는 어색했지만 지금은 css보다 테일윈드가 훨씬 편한것같다. 그리고 따로 설정없이 반응형이 된다는게 큰 메리트가 있는듯 하다. 

 

각각 칸의 코드는 모두 동일 하다. 타이틀, input 그리고 valid로 에러메세지를 표시했다. 

  const handleId = (e) => {
    setId(e.target.value);
    const regex = /^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]{4,20}$/;
    setIdValid(regex.test(e.target.value));
  };

  const handlePw = (e) => {
    setPw(e.target.value);
    const regex =
      /^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+])(?!.*[^a-zA-z0-9$`~!@$!%*#^?&\\(\\)\-_=+]).{8,20}$/;
    setPwValid(regex.test(e.target.value));
  };

아이디와 비밀번호는 정규식을 이용해 유효성검사를 했고, 이메일은 내가맡은 파트가 전문의 회원가입인만큼 의사협회 메일로만 가입할 수 있게 구성했다. 원래는 면허번호를 입력해 인증할 수있는 api를 찾아보려 했지만, 결국 찾지못했다...

시연때 보여주기 위해 내 이메일은 가능하게 만들었다.

 

 

 

자바 메일샌더를 이용해 구현했다,

 

이름 표현을 위해 확인 코드전송을 누르면 

위에 칸에 입력된 이름과 랜덤으로 만든 인증코드를 백서버로 전송한다

 

#이메일 전송객체
package org.ict.atti_boot.doctor.model.dto;

import lombok.Data;

@Data
public class EmailRequest {
    private String email;
    private String code;
    private Long numberOfMembers;
    private String doctorName;
}

#컨트롤러
    @PostMapping("/mail")
    public ResponseEntity<String> sendEmail(@RequestBody EmailRequest request) {
        try {
            request.setNumberOfMembers(doctorService.findAllUserCount());
            doctorService.sendEmail(request);
            return ResponseEntity.ok("Email sent successfully");
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error sending email");
        }
    }

 

유저 수도 보여주기 위해 전체 일반유저수를 계산해 이메일객체에 담는다.

 

    public void sendEmail(EmailRequest request) {
        try {
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
            log.info(request.toString());
            helper.setTo(request.getEmail());
            helper.setSubject("Atti에 방문하신걸 진심으로 환영합니다." + request.getDoctorName() + "님");

            // HTML 콘텐츠 작성
            String htmlContent = "<div style=\"background-color: #8ab68a; padding: 40px; margin: 20px auto; border-radius: 40px; max-width: 800px;\">"
                    + "<div style=\"text-align: center; margin-bottom: 40px; color: white;\">"
                    + "<h1>저희 Atti 회원가입을 환영합니다!</h1>"
                    + "</div>"
                    + "<div style=\"display: flex; flex-wrap: wrap; align-items: center;\">"
                    + "<div style=\"flex: 1; padding: 10px; text-align: center;\">"
                    + "<div style=\"background-color: #ffffff; padding: 20px; border-radius: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\">"
                    + "<p style=\"font-size: 18px; color: #333;\">"
                    + "지금 <strong style=\"color: #ff6f61;\">" + request.getNumberOfMembers() + "</strong>명의 회원이 전문가님의 도움을 기다리고 있어요!"
                    + "</p>"
                    + "<h3 style=\"font-size: 24px; margin-top: 20px;\">"
                    + "인증코드: <strong>" + request.getCode() + "</strong>"
                    + "</h3>"
                    + "</div>"
                    + "</div>"
                    + "<div style=\"flex: 1; text-align: center;\">"
                    + "<img src=\"cid:mailForDoctor\" style=\"width: 80%; height: auto;\" />"
                    + "</div>"
                    + "</div>"
                    + "</div>";

            helper.setText(htmlContent, true);
            // 이미지 첨부 (이미지를 인라인으로 추가)
            helper.addInline("mailForDoctor", new FileSystemResource("src/main/resources/img/mailForDoctor.png"));

            mailSender.send(message);
            log.info("메일전송 완료!");
        } catch (MessagingException e) {
            throw new RuntimeException("Failed to send email", e);
        }
    }

 

 

이제 서비스에서 html 코드를 짜서 보낸다 . 이미지도 보낼 수 있었다는게 신기했던 점

저 메일 모양은 열심히 vs코드로 따로 작성하며 확인한 후 한번에 붙여넣었다. 

근데 결과는 무슨 3급 외국사이트 메일처럼 온거같아서 그렇게 마음에 들진않는다..

'프로젝트 > 2차프로젝트' 카테고리의 다른 글

전문의 목록/검색  (0) 2024.06.28
Cunsultify 프로젝트  (0) 2024.06.24
클래스설계 && 시퀀스설계  (0) 2024.05.27
Consultify - 인터페이스 설계  (0) 2024.05.22
복사했습니다!