PlayData 백엔드 부트캠프 정리

다시 시작하는 부트 캠프 하루 후기 1일차

효건 2024. 10. 15. 09:04

 지금껏 많이 진행되었으나 여러 취업, 면접 이슈때문이라는 변명으로 잠깐 쉬었는데 사실 귀찮았던 것 같습니다. 

하지만 결측치가 발생했다 치고 한번 해볼까 합니다.

1. 쿠키를 이용한 로그인 유지 설정 로직 (Controller)

private void makeLoginCookie(LoginRequestDTO dto, HttpServletResponse response) {
    // 쿠키에 로그인 기록을 저장
    // 쿠키 객체를 생성 -> 생성자의 매개값으로 쿠키의 이름과 저장할 값을 전달. (문자열만 가능, 4KB)
    Cookie cookie = new Cookie("login", dto.getAccount());

    // 쿠키 세부 설정
    cookie.setMaxAge(60); // 쿠키 수명 설정(초)
    cookie.setPath("/"); // 이 쿠키는 모든 경로에서 유효하다.

    // 쿠키가 완성되었다면 응답 객체에 쿠키를 태워서 클라이언트로 전송
    response.addCookie(cookie);
}

 

2. 쿠키를 이용하여 자동로그인 유지 로직

//1. 자동 로그인 쿠키 생성 - 쿠키안에는 중복되지 않는 값을 저장.
//UUID, 브라우저 세션 아이디를 이용.
Cookie autoCookie = new Cookie("auto", session.getId());

//2. 쿠키걸정 - 사용경로, 수명...
int limitTime = 60*60*24*7;//자동로그인 유지 시간(초)
autoCookie.setPath("/");
autoCookie.setMaxAge(limitTime);

//3. 쿠키를 클라이언트에게 전송하기 위해서 응답객체에 태우기 
response.addCookie(autoCookie);

 

클라이언트 측에서 WAS으로 요청과 쿠키를 보낸다(사용자가 브라우저를 종료했다가 웹페이지에 다시 들어왔다)

모든 요청에서 응답들을 가져오는 것이다. 

 

3. xml (sql에 명령하는 로직)

    <update id="saveAutoLogin">
        UPDATE tbl_member
        SET session_id = #{sessionId}, limit_time = #{limitTime}
        WHERE account = #{account}
    </update>

 

데이터 베이스에서  쿠키 세션 아이디를 가져와서 대조하여 확인하는 방식으로 자동 로그인을 유지하는 방식이다. 

데이터에 잠깐 저장하자 

근데 여기서 문제가 있습니다. 브라우저를 꺼도 데이터 베이스에 저장했기 떄문에 로그아웃이 안되는 일이 발생할 수있다는 것입니다. 따라서 로그아웃 하는 로직을 작성할 필요가 있습니다. 

 

4. 데이터베이스에서도 세션 아이디와 만료시간을 정해 자동 로그아웃되도록 설정

// 데이터베이스에도 세션아이디와 만료시간을 정리해주자.
memberMapper.saveAutoLogin(
        AutoLoginDTO.builder()
                .sessionId("none") // 기존 세션아이디 지우기
                .limitTime(LocalDateTime.now())
                .account(getCurrentLoginMemberAccount(request.getSession()))
                .build()
);

※중간 중간에 DTO 파일을 만들어서 가져올수있도록 설정이 되어있습니다. ㅎㅎ

 

5.

 

2. 아이콘 사진 추가서비스 

1) 초기설정 (application.properties에서 진행 ) -> 왜냐하면 초기값이 1mb로 제한이 되어 있어 사용자가 불편할수있다.

# file upload setting
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=10MB

 

2) 백엔드에서 받아와야 하므로 Controller 제작

public String UploadForm(){
    return "upload/upload-Form"; // 저장하는 곳
}

@PostMapping("/upload-file")
public String uploadForm (@RequestParam("thumbnail")MultipartFile file){
    log.info("file-name:{}",file.getOriginalFilename());
    log.info("file-size:{}",file.getSize());
    log.info("file-type:{}",file.getContentType());

 

3) Controller 내 로직 작성 파일을 받고 DB에 작성할 로직임, -> 그렇다고 DB에 사진을 저장하는 것이 아니라 DB에 사진의 경로를 저장하는 것입니다. 왜냐하면 DB는 매우 비싸기 때문입니다.

        //첨부파일을 서버 스토리지에 저장
        //1. 루트 디렉토리를 생성.
        File root = new File(rootPath);
        if(!root.exists()) root.mkdir();


        //2. 랜덤한 문자조합을 이용해서 새 팡리명을 생성.
        // UUID: Universally Unique Identifieied
        // 네트워크 상에서 고유성이 보장되는 id를 만들기 위한 표준 규약.
        UUID uuid = UUID.randomUUID();
        log.info("uuid:{}",uuid.toString());

        String fileName = uuid.toString();
        fileName = fileName.replace("-","");

        //3.원본 파일명에서 확장자 떼기 (temp.jpg)
        String fileExt
                = file.getOriginalFilename().substring(
                        //뒤에서 부터 탐색했을때 . 부터 끝까지 추출.
                        file.getOriginalFilename().lastIndexOf("."));
        log.info("확장자:{}",fileExt);

        //완성된 경로를 가진 FIle객체 생성.
        File UpLoadFile = new File(rootPath, fileName+fileExt);


        //4. 지정한 경로로 파일을 전송.
        try {
            file.transferTo(UpLoadFile);
        }catch (IOException e){
            e.printStackTrace();
        }


        return null;
    }

 

오늘은 여기까지