controller/

LedgerController.java

package com.example.pkscl.controller;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.example.pkscl.data.dto.ReceiptModel;
import com.example.pkscl.service.LedgerService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;


@Slf4j
// 문제점 1.  majorNumber랑 API로 수정하고자하는 곳이 다르면 403을 띄워야함.. 근데 이많은걸 다 어떻게?
@RestController
public class LedgerController {

    private final LedgerService ledgerService;

    @Autowired
    public LedgerController(LedgerService ledgerService) {
        this.ledgerService = ledgerService;
    }

    @GetMapping(value = "/major-info")
    public Map<String, Object> getLedger(HttpServletRequest request, HttpServletResponse response) {
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String position = (String) request.getSession(false).getAttribute("position");
        String status = (String) request.getSession(false).getAttribute("status");

        if(!status.equals("approval")) {
            response.setStatus(403);
            return null;
        }

        return ledgerService.getLedgerData(majorNumber, position);
    }

    @GetMapping(value = "/major-info/admin")
    public Map<String, Object> getLedgerAdmin(@RequestParam(value = "major-number", required = true) String majorNumber, HttpServletRequest request, HttpServletResponse response) {
        String position = (String) request.getSession(false).getAttribute("position");

        return ledgerService.getLedgerData(majorNumber, position);
    }

    @GetMapping(value = "/temp-major-info")
    public Map<String, Object> getTempLedger(HttpServletRequest request, HttpServletResponse response){
        return ledgerService.getLedgerData("0", "president");
    }

    @Transactional(isolation = Isolation.SERIALIZABLE)
    @PostMapping(value = "/event")
    public void addLedger(@RequestBody Map<String, Object> body, HttpServletRequest request, HttpServletResponse response) {
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String position = (String) request.getSession(false).getAttribute("position");
        String status = (String) request.getSession(false).getAttribute("status");
        String quarter = (String) body.get("quarter");

        // 403 Forbidden
        if(!position.equals("president") || !status.equals("approval")) {
            response.setStatus(403);
            return;
        }

        ledgerService.addEvent(majorNumber, quarter);
    }

    @Transactional(isolation = Isolation.SERIALIZABLE)
    @DeleteMapping(value = "/event")
    public void deleteLedger(@RequestParam(value = "event-number", required = true) String eventNumber, HttpServletRequest request, HttpServletResponse response) {
        String position = (String) request.getSession(false).getAttribute("position");
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String status = (String) request.getSession(false).getAttribute("status");

        // 403 Forbidden
        if(!position.equals("president") || !status.equals("approval") || !ledgerService.checkMajor("event", eventNumber, majorNumber)) {
            response.setStatus(403);
            return;
        }
        

        ledgerService.deleteEvent(eventNumber);
    }

    @GetMapping(value = "/ledger-date")
    public Map<String, Object> getLedgerDate(@RequestParam(value = "major-number", required = false) String adminMajorNumber, HttpServletRequest request, HttpServletResponse response) {
        String position = (String) request.getSession(false).getAttribute("position");
        if(position.equals("admin")) {
            return ledgerService.getLedgerDate(adminMajorNumber);
        }
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");

        return ledgerService.getLedgerDate(majorNumber);
    }

    @Transactional(isolation = Isolation.SERIALIZABLE)
    @PutMapping(value = "/ledger-date")
    public void putLedgerDate(@RequestBody Map<String, Object> body, HttpServletRequest request, HttpServletResponse response) {
        String position = (String) request.getSession(false).getAttribute("position");
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String status = (String) request.getSession(false).getAttribute("status");
        String quarter = (String) body.get("quarter");
        String openDate = (String) body.get("openDate");
        String closeDate = (String) body.get("closeDate");

        // 403 Forbidden
        if(!position.equals("president") || !status.equals("approval")) {
            response.setStatus(403);
            return;
        }

        ledgerService.putLedgerDate(majorNumber, quarter, openDate, closeDate);
    }

    @Transactional(isolation = Isolation.SERIALIZABLE)
    @PatchMapping(value = "/event")
    public void patchEvent(@RequestBody Map<String, Object> body, HttpServletRequest request, HttpServletResponse response) {
        String position = (String) request.getSession(false).getAttribute("position");
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String status = (String) request.getSession(false).getAttribute("status");
        String eventNumber = (String) body.get("eventNumber");
        String eventTitle = (String) body.get("eventTitle");
        String eventContext = (String) body.get("eventContext");

        if(!position.equals("president")){
            log.info("position error");
        }
        if(!status.equals("approval")) {
            log.info("status error");
        }
        if(!ledgerService.checkMajor("event", eventNumber, majorNumber)) {
            log.info("majorNumber error");
        }
        // 403 Forbidden
        if(!position.equals("president") || !status.equals("approval") || !ledgerService.checkMajor("event", eventNumber, majorNumber)) {
            response.setStatus(403);
            return;
        }

        ledgerService.patchEvent(eventNumber, eventTitle, eventContext);
    }

    @Transactional(isolation = Isolation.SERIALIZABLE)
    @PostMapping(value = "/receipt")
    public void postReceipt(@ModelAttribute ReceiptModel receiptModel, HttpServletRequest request, HttpServletResponse response) {
        
        // receiptModel출력
        System.out.println(receiptModel);
        String position = (String) request.getSession(false).getAttribute("position");
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String status = (String) request.getSession(false).getAttribute("status");

        //403 Forbidden
        if(!position.equals("president") || !status.equals("approval") || !ledgerService.checkMajor("event", receiptModel.getEventNumber(), majorNumber)) {
            response.setStatus(403);
            return;
        }

        ledgerService.postReceipt(receiptModel);
    }

    @Transactional(isolation = Isolation.SERIALIZABLE)
    @PutMapping(value = "/receipt")
    public void putReceipt(@ModelAttribute ReceiptModel receiptModel, HttpServletRequest request, HttpServletResponse response) {

        // receiptModel출력
        System.out.println(receiptModel);
        String position = (String) request.getSession(false).getAttribute("position");
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String status = (String) request.getSession(false).getAttribute("status");

        // 403 Forbidden
        if(!position.equals("president") || !status.equals("approval") || !ledgerService.checkMajor("receipt", receiptModel.getReceiptNumber(), majorNumber)) {
            response.setStatus(403);
            return;
        }

        ledgerService.putReceipt(receiptModel);
    }

    @Transactional(isolation = Isolation.SERIALIZABLE)
    @DeleteMapping(value = "/receipt")
    public void deleteReceipt(@RequestParam(value = "receipt-number", required = true) String receiptNumberList, HttpServletRequest request, HttpServletResponse response) {
        String position = (String) request.getSession(false).getAttribute("position");
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String status = (String) request.getSession(false).getAttribute("status");

        // 403 Forbidden
        if(!position.equals("president") || !status.equals("approval")) {
            response.setStatus(403);
            return;
        }


        ledgerService.deleteReceiptList(receiptNumberList, majorNumber, response);
    }

    @Transactional(isolation = Isolation.SERIALIZABLE)
    @PatchMapping(value = "/event-sequence")
    public void patchEventSequence(@RequestBody Map<String, Object> body, HttpServletRequest request, HttpServletResponse response) {
        String position = (String) request.getSession(false).getAttribute("position");
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String status = (String) request.getSession(false).getAttribute("status");
        List<String> eventNumberList = (List<String>) body.get("eventNumberList");

        // 403 Forbidden
        if(!position.equals("president") || !status.equals("approval")) {
            response.setStatus(403);
            return;
        }
        for(String eventNumber : eventNumberList) {
            if(!ledgerService.checkMajor("event", eventNumber, majorNumber)) {
                response.setStatus(403);
                return;
            }
        }

        ledgerService.patchEventSequence(eventNumberList);
    }

    

}

MemberManagementController.java

package com.example.pkscl.controller;

import com.example.pkscl.service.MemberManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

@RestController
public class MemberManagementController {

    private final MemberManagementService memberManagementService;

    @Autowired
    public MemberManagementController(MemberManagementService memberManagementService) {
        this.memberManagementService = memberManagementService;
    }
    
    @GetMapping(value = "/student-list")
    public Map<String,Object> studentList(HttpServletRequest request, HttpServletResponse response) {

        // 서비스 파라미터 설정
        String position = (String) request.getSession(false).getAttribute("position");
        String status = (String) request.getSession(false).getAttribute("status");
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");

        // 400 Bad Request
        if(majorNumber == null) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return null;
        }

        // 403 Forbidden
        if(!position.equals("president") || !status.equals("approval")) {
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            return null;
        }

        // 서비스 호출 및 반환
        return memberManagementService.getStudentData(majorNumber);
    }

    @PatchMapping(value = "/student-list")
    public void patchStudentStatus(@RequestBody Map<String, Object> body, HttpServletRequest request, HttpServletResponse response) {

        // 서비스 파라미터 설정
        String position = (String) request.getSession(false).getAttribute("position");
        String status = (String) request.getSession(false).getAttribute("status");
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String patchStatus = (String) body.get("status");
        List<String> emailList = (List<String>) body.get("email");

        // 400 Bad Request
        if(emailList == null || emailList.size() == 0 || patchStatus == null) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return;
        }

        // 403 Forbidden
        if(!position.equals("president") || !status.equals("approval")) {
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            return;
        }

        // 서비스 호출
        for(String email : emailList) {
            memberManagementService.patchStudentStatus(email, patchStatus, majorNumber);
        }
    }

    @GetMapping(value = "/president-list")
    public Map<String,Object> presidentList(HttpServletRequest request, HttpServletResponse response) {

        // 서비스 파라미터 설정
        String position = (String) request.getSession(false).getAttribute("position");
        
        // 403 Forbidden
        if(!position.equals("admin")) {
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            return null;
        }

        // 서비스 호출 및 반환
        return memberManagementService.getPresidentData();
    }

    @PatchMapping(value = "/president-list")
    public void patchPresidentStatus(@RequestBody Map<String, Object> body, HttpServletRequest request, HttpServletResponse response) {

        // 서비스 파라미터 설정
        String position = (String) request.getSession(false).getAttribute("position");
        String patchStatus = (String) body.get("status");
        List<String> emailList = (List<String>) body.get("email");

        // 400 Bad Request
        if(emailList == null || emailList.size() == 0 || patchStatus == null) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return;
        }

        // 409 Conflict


        // 403 Forbidden
        if(!position.equals("admin")) {
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            return;
        }

        // 서비스 호출
        for(String email : emailList) {
            memberManagementService.patchPresidentStatus(email, patchStatus, response);
        }
    }

    @PatchMapping(value = "/major-president")
    public void patchMajorPresident(@RequestBody Map<String, Object> body, HttpServletRequest request, HttpServletResponse response) {

        // 서비스 파라미터 설정
        String position = (String) request.getSession(false).getAttribute("position");
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String presidentEmail = (String) request.getSession(false).getAttribute("email");
        String newPresidentEmail = (String) body.get("email");

        // 403 Forbidden
        if(!position.equals("president")) {
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            return;
        }

        // 서비스 호출
        memberManagementService.patchMajorPresident(presidentEmail, newPresidentEmail, majorNumber, response);
    }

}

ProfileController.java

package com.example.pkscl.controller;

import com.example.pkscl.data.dto.PresidentProfileModel;
import com.example.pkscl.data.dto.StudentProfileModel;
import com.example.pkscl.service.ProfileService;
import java.util.LinkedHashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@RestController
public class ProfileController {
    private final ProfileService profileService;
    private final PasswordEncoder passwordEncoder;

    @Autowired
    public ProfileController(ProfileService profileService, PasswordEncoder passwordEncoder) {
        this.profileService = profileService;
        this.passwordEncoder = passwordEncoder;
    }

    // 학생 및 학과회장 정보로드
    @GetMapping(value = "/profile")
    public Map<String,Object> studentProfile(HttpServletRequest request, HttpServletResponse response) {



        // 세션 여부를 판단하기 위한 변수 설정
        String email = (String) request.getSession(false).getAttribute("email");
        String majorNumber = (String) request.getSession(false).getAttribute("majorNumber");
        String position = (String) request.getSession(false).getAttribute("position");



        // 400 Bad Request
        if(majorNumber == null || email==null || position==null) {
            Map<String,Object> errorMsg = new LinkedHashMap<>();
            errorMsg.put("errorMessage", "존재하지 않는 회원입니다.");
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);

            return errorMsg;
        }

        // 서비스 호출 및 반환
        return profileService.getProfileData(position, email, majorNumber);
    }

    // 학생 정보 변경
    @PutMapping(value = "/profile/student") //president로 나눠야함 form양식이 달라서
    public void patchStudentStatus(@ModelAttribute StudentProfileModel studentProfileModel, MultipartFile certFile,  HttpServletRequest request, HttpServletResponse response) throws Exception{

        // 403
        if(studentProfileModel.getStdID().equals(null) || studentProfileModel.getMajorNumber() == 0 ||
            studentProfileModel.getName().equals(null)) {
            Map<String,Object> errorMsg = new LinkedHashMap<>();
            response.setStatus(403);
            return;
        }

        // 세션서 이메일값을 받아온다.
        String email = (String) request.getSession(false).getAttribute("email");

        String stdID = studentProfileModel.getStdID();
        int major =  studentProfileModel.getMajorNumber();
        String name  = studentProfileModel.getName();

        String fileName = null;

        if(certFile != null) {
            fileName = new java.text.SimpleDateFormat("yyyyMMddHHmmssSSS").format(new java.util.Date());
            fileName = fileName + certFile.getOriginalFilename().substring(certFile.getOriginalFilename().lastIndexOf("."));
            profileService.fileUploadStd(fileName, certFile);

        }

        // 레포에 업데이트
        profileService.putStudentProfileData(email, stdID, major, name, fileName);


    }

    @PutMapping(value = "/profile/president") //president로 나눠야함 form양식이 달라서
    public void patchPresidentStatus(@ModelAttribute PresidentProfileModel presidentProfileModel, MultipartFile majorLogo,  HttpServletRequest request, HttpServletResponse response) throws Exception{

        // 403 Forbidden
        if(presidentProfileModel.getStdID().equals(null) || presidentProfileModel.getPhoneNumber().equals(null) ||
            presidentProfileModel.getName().equals(null)) {
            response.setStatus(403);
            return;
        }

        String email = (String) request.getSession(false).getAttribute("email");

        String stdID = presidentProfileModel.getStdID();
        String name = presidentProfileModel.getName();
        String phoneNumber= presidentProfileModel.getPhoneNumber();
        String majorNumber = presidentProfileModel.getMajorNumber();


        String fileName = null;

        if(majorLogo != null) {
            fileName = new java.text.SimpleDateFormat("yyyyMMddHHmmssSSS").format(new java.util.Date());
            fileName = fileName + majorLogo.getOriginalFilename().substring(majorLogo.getOriginalFilename().lastIndexOf("."));
            profileService.fileUploadLogo(fileName, majorLogo);

        }
        profileService.putPresidentProfileData(email, stdID, name, phoneNumber, fileName, majorNumber);
    }

    @PatchMapping(value = "/password")
    public void patchPassword(@RequestBody Map<String, Object> body,  HttpServletRequest request, HttpServletResponse response){

        String email =(String) request.getSession(false).getAttribute("email");
        String position = (String) request.getSession(false).getAttribute("position");
        
        String inputPassword = (String) body.get("inputPassword");
        String inputNewPassword = (String) body.get("inputNewPassword");
        String inputCheckNewPassword = (String) body.get("inputCheckNewPassword");

        // 403 Forbidden
        if(inputPassword.equals(null) || inputNewPassword .equals(null)||  !inputNewPassword.equals(inputCheckNewPassword)) {
            response.setStatus(403); return;
        }

        else if(position.equals("student")){
        // 학생 기존 비번이랑 같은지 체크
            if (!passwordEncoder.matches(inputPassword, profileService.getStudentPassword(email))) {
                response.setStatus(401); return;
            }
            else profileService.patchStudentPassword(email, inputNewPassword);
        }

        else if(position.equals("president")){
        // 학생 기존 비번이랑 같은지 체크
            if(!passwordEncoder.matches(inputPassword, profileService.getPresidentPassword(email))) {
                response.setStatus(401); return;
            }
            else profileService.patchPresidentPassword(email, inputNewPassword);
        }

 }
}

SignInController.java

package com.example.pkscl.controller;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.example.pkscl.service.SignInService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SignInController {

    private final SignInService signInService;
    
    @Autowired  
    public SignInController(SignInService signInService) {
        this.signInService = signInService;
    }

    @PostMapping(value = "/login/student")
    public void studentSignIn(@RequestBody Map<String, Object> body, HttpServletRequest request, HttpServletResponse response) {
        
        // 서비스 파라미터 설정
        String email = (String) body.get("email");
        String password = (String) body.get("password");

        // 400 Bad Request
        if(email == null || password == null) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return;
        }

        // 401 Unauthorized
        boolean match = signInService.studentMatch(password, email);
        if(!match) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return;
        }
        
        // 세션 설정
        String majorNumber = signInService.getStudentMajor(email)+"";
        String status = signInService.getStudentStatus(email);
        HttpSession session = request.getSession();
        session.setAttribute("position", "student");
        session.setAttribute("email", email);
        session.setAttribute("majorNumber", majorNumber);
        session.setAttribute("status", status);
        
    }

    @PostMapping(value = "/login/president")
    public void presidentSignIn(@RequestBody Map<String, Object> body, HttpServletRequest request, HttpServletResponse response) {
    
        // 서비스 파라미터 설정
        String email = (String) body.get("email");
        String password = (String) body.get("password");

        // 400 Bad Request
        if (email == null || password == null) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return;
        }

        // 401 Unauthorized
        boolean match = signInService.presidentMatch(password, email);
        if(!match) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return;
        }

        // 세션 생성
        String majorNumber = signInService.getPresidentMajor(email)+"";
        String status = signInService.getPresidentStatus(email);
        HttpSession session = request.getSession();
        session.setAttribute("position", "president");
        session.setAttribute("email", email);
        session.setAttribute("majorNumber", majorNumber);
        session.setAttribute("status", status);
            
    }

    @PostMapping(value = "/login/admin")
    public void adminSignIn(@RequestBody Map<String, Object> body, HttpServletRequest request, HttpServletResponse response) {
        
        // 서비스 파라미터 설정
        String id = (String) body.get("email");
        String password = (String) body.get("password");

        // 400 bad request
        if (id == null || password == null) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return;
        }

        // 401 unauthorized
        boolean match = signInService.adminMatch(password, id);
        if(!match){
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return;
        }

        // 세션 생성
        HttpSession session = request.getSession();
        session.setAttribute("position", "admin");
        session.setAttribute("id", id);

    }

    @PostMapping("/logout") 
    public void logout(HttpServletRequest request, HttpServletResponse response) throws IOException
    { 
        HttpSession session = request.getSession(false);
        session.invalidate();
        response.setStatus(HttpServletResponse.SC_OK);
    }

    @PostMapping("/withdrawal")
    public void secession(@RequestBody Map<String, Object> body, HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        // 서비스 파라미터 설정
        HttpSession session = request.getSession(false);
        String position = (String) session.getAttribute("position");
        String email = (String) session.getAttribute("email");
        String checkemail = (String) body.get("inputEmail");
        String password = (String) body.get("inputPassword");

        // 400 bad request
        if (checkemail == null || password == null) {

            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return;

        }

        if(position.equals("student")) {

            // 401 unauthorized
            // 이메일, 비밀번호 일치 여부 확인
            if(!checkemail.equals(email) || !signInService.studentMatch(password, email)) {
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return;
            }

            // 탈퇴 
            signInService.withdrawalStudent(email);

        } else if(position.equals("president")) {

            // 401 unauthorized
            // 이메일, 비밀번호 일치 여부 확인
            if(!checkemail.equals(email) || !signInService.presidentMatch(password, email)) {
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return;
            }

            // 탈퇴
            signInService.withdrawalPresident(email);

        }

        // 세션 삭제
        session.invalidate();
        response.setStatus(HttpServletResponse.SC_OK);

    }

    @GetMapping("/status")
    public Map<String, Object> getStatus(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        HttpSession session = request.getSession(false);
        String status = (String) session.getAttribute("status");

        LinkedHashMap<String, Object> result = new LinkedHashMap<>();
        result.put("status", status);

        return result;
    }

    @GetMapping("/position")
    public Map<String, Object> getPosition(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        HttpSession session = request.getSession(false);
        String position = (String) session.getAttribute("position");

        LinkedHashMap<String, Object> result = new LinkedHashMap<>();
        result.put("position", position);

        return result;
    }

}

SignUpController.java

package com.example.pkscl.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import com.example.pkscl.data.entity.member.President;
import com.example.pkscl.data.dto.PresidentModel;
import com.example.pkscl.data.entity.member.Student;
import com.example.pkscl.data.dto.StudentModel;
import com.example.pkscl.service.SignUpService;

@RestController
public class SignUpController {

    private final SignUpService signUpService;
    
    @Autowired
    public SignUpController(SignUpService signUpService) {
        this.signUpService = signUpService;
    }

    @PostMapping(value = "/signup/student")
    public void signUpStudent(@ModelAttribute StudentModel studentModel, MultipartFile certFile, HttpServletResponse response) throws Exception {

        Student student = new Student();
        student.setEmail(studentModel.getEmail());
        String password = studentModel.getPassword();

        // 401 Unauthorized
        if(!password.equals(studentModel.getCheckPassword())) {
            response.setStatus(401);
            return;
        }
        student.setPassword(password);
        student.setMajornumber(studentModel.getMajor());
        student.setStudentid(studentModel.getStdID());
        student.setName(studentModel.getName());
        
        // file_name을 현재시간을 기준으로 yyyyMMddHHmmssSSS.jpg 형태로 설정
        String dir = "./static/studentCertFile/";
        String filename = new java.text.SimpleDateFormat("yyyyMMddHHmmssSSS").format(new java.util.Date());
        String ext = certFile.getOriginalFilename().substring(certFile.getOriginalFilename().lastIndexOf("."));
        student.setCertfilepath(dir + filename + ext);

        //중복확인후 400반환
        if(!signUpService.studentCheckEmail(student.getEmail())) {
            response.setStatus(409);
            return;
        }

        signUpService.fileUpload(filename+ext, certFile);
        if(!signUpService.signUpStudent(student)) {
            response.setStatus(403);
        }
        
    }

    @PostMapping(value = "/signup/president")
    public void signUpPresident(@ModelAttribute PresidentModel presidentModel, MultipartFile certFile, HttpServletResponse response) throws Exception {

        President president = new President();
        president.setEmail(presidentModel.getEmail());
        String password = presidentModel.getPassword();

        // 401 Unauthorized
        if(!password.equals(presidentModel.getCheckPassword())) {
            response.setStatus(401);
            return;
        }
        president.setPassword(password);
        president.setName(presidentModel.getName());
        president.setMajornumber(presidentModel.getMajor());
        president.setStudentid(presidentModel.getStdID());
        president.setPhonenumber(presidentModel.getPhoneNumber());
        
        //중복확인후 400반환
        if(!signUpService.presidentCheckEmail(president.getEmail())) {
            response.setStatus(409);
            return;
        }

        if(!signUpService.signUpPresident(president)) {
            response.setStatus(403);
        }
    }

    @GetMapping(value = "/major-list")
    public Map<String,Object> getMajorList() {
        return signUpService.getMajorList();
    }

}

SMTPController.java

package com.example.pkscl.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import com.example.pkscl.service.SMTPService;
import com.example.pkscl.service.SignUpService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SMTPController {
    
    private static final String VERIFY_SUCCESS_MESSAGE = "<script>alert('이메일 인증이 완료되었습니다. 회원가입을 계속 진행해주세요.'); </script>";
    private static final String VERIFY_FAIL_MESSAGE = "<script>alert('인증에 실패하였습니다.');</script>";
    private final SMTPService smtpService;
    private final SignUpService signUpService;

    @Autowired
    public SMTPController(SMTPService smtpService, SignUpService signUpService) {
        this.smtpService = smtpService;
        this.signUpService = signUpService;
    }

    @PostMapping(value = "/email/{position}")
    public void sendEmail(@RequestBody Map<String, Object> body, @PathVariable String position, HttpServletResponse response) {

        String email = (String) body.get("email");

        // 이메일 형식 확인
        if (!smtpService.checkEmailForm(email)) {
            response.setStatus(HttpStatus.BAD_REQUEST.value());
            return;
        }

        // 중복확인
        if(position.equals("student")){
            if(!signUpService.studentCheckEmail(email)) {
                response.setStatus(HttpStatus.CONFLICT.value());
                return;
            }
        }else if(position.equals("president")){
            if(!signUpService.presidentCheckEmail(email)) {
                response.setStatus(HttpStatus.CONFLICT.value());
                return;
            }
        }else{
            response.setStatus(HttpStatus.BAD_REQUEST.value());
            return;
        }

        smtpService.sendEmailAuth(email, position);
    }

    @GetMapping(value = "/verify/token/{position}")
    public void verifyToken(@RequestParam String token, @PathVariable String position, HttpServletResponse response) throws IOException {
        if(position.equals("student")){
            if(!smtpService.studentVerifyToken(token)){
                response.setContentType("text/html; charset=euc-kr");
                PrintWriter out = response.getWriter();
                // alert 창 확인시 창 닫기
                out.println(VERIFY_FAIL_MESSAGE);
                out.flush();
                return;
            }
        }else if(position.equals("president")){
            if(!smtpService.presidentVerifyToken(token)){
                response.setContentType("text/html; charset=euc-kr");
                PrintWriter out = response.getWriter();
                // alert 창 확인시 창 닫기
                out.println(VERIFY_FAIL_MESSAGE);
                out.flush();
                return;
            }
        }else{
            response.setContentType("text/html; charset=euc-kr");
            PrintWriter out = response.getWriter();
            // alert 창 확인시 창 닫기
            out.println(VERIFY_FAIL_MESSAGE);
            out.flush();
            return;
        }

        response.setContentType("text/html; charset=euc-kr");
        PrintWriter out = response.getWriter();
        // alert 창 확인시 창 닫기
        out.println(VERIFY_SUCCESS_MESSAGE);
        out.flush();
    }
    
    // 임시 비밀번호 발급
    @PostMapping(value = "/newpwd/{position}")
    public void newPassword(@RequestBody Map<String, Object> param, @PathVariable String position, HttpServletResponse response) {
        String email = (String) param.get("email");
        String name = (String) param.get("name");
        String studentId = (String) param.get("stdID");
        if(position.equals("student")){
            if(smtpService.studentTempPassword(email, name, studentId) < 0) response.setStatus(HttpStatus.BAD_REQUEST.value());
        }else if(position.equals("president")){
            if(smtpService.presidentTempPassword(email, name, studentId) < 0) response.setStatus(HttpStatus.BAD_REQUEST.value());
        }else{
            response.setStatus(HttpStatus.BAD_REQUEST.value());
        }
    }
    
}

TestController.java

package com.example.pkscl.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    
    @GetMapping("/whoami")
    // 세션으로부터 email, position 정보를 가져온다.
    public String whoami(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        String email = (String) session.getAttribute("email");
        String position = (String) session.getAttribute("position");
        String majorNumber = (String) session.getAttribute("majorNumber");
        String status = (String) session.getAttribute("status");
        return "email: " + email + ", position: " + position + ", majorNumber: " + majorNumber + ", status: " + status;
    }
}

WebController.java

package com.example.pkscl.controller;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class WebController implements ErrorController {
    
        @GetMapping("/error")
        public String error() {
            return "/index.html";
        }
    
}

Last updated