오랜만에 쓰는 TIL

doobyeol·2022년 9월 20일
0

TIL

목록 보기
28/31

너무 오랜만에 써서 죄책감이 좀 들지만 그동안 휴가도 다녀오고 코로나도 걸리고 일하느라 바쁘고 했답니다요 😭

1. 보안을 위해 신경써야 하는 것들

  • API 요청자의 ID와 로그인 ID 확인

    수정 API를 만드는 경우 Request를 보낸 사람과 기존 글을 작성한 사람이 같은 사람인지를 확인해주어야 한다.
    짱구가 쓴 일기를 만약 짱아가 수정하려고 하면 안되잖아욥 ..? 그래서 일기장의 주인과 일기장을 열어본 사람의 이름이 동일한지를 확인해주는 과정이다..!
    Request 요청자는 로그인한 ID와 동일해야 한다. 우리는 Spring Security를 적용하면서 로그인한 사용자 정보를 SecurityContextHolder에서 저장하고 있다. 그리고 이런 로그인한 사용자 정보를 서비스단에서 종종 필요로 하는 경우가 있기 때문에 Util클래스로 만들도록 하자!
    @NoArgsConstructor(access = AccessLevel.PRIVATE) : new 해서 생성할 수 없도록 기본 생성자를 private으로 만들어주는 어노테이션! 유틸클래스를 만들때 주로 사용
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class RequestContextHelper {

    public static UserDto getLoginUserInfo() {
        return (UserDto) RequestContextHolder.getRequestAttributes().getAttribute("loginUserInfo", RequestAttributes.SCOPE_SESSION);
    }

    public static void setLoginUserInfo(UserDto userDto) {
        RequestContextHolder.getRequestAttributes().setAttribute("loginUserInfo", userDto, RequestAttributes.SCOPE_SESSION);
    }

}
  • Response에 에러를 던져줄때 너무 적나라한 에러 로그나 메세지는 해커를 신나게 한다.

    개발자가 보는 에러 코드는 직관적이되, 사용자가 볼 수 있는 메세지는 에러 로그를 그대로 보여주거나, 자세한 에러 설명을 보내지 않도록 주의하자.
INVALID_REFRESH_TOKEN("0001", "유효하지 않은 Refresh Token 입니다."),
BAD_CREDENTIALS("0002", "ID 또는 비밀번호를 확인해주세요."),
FAILED_SAVE("0003", "저장시 오류가 발생했습니다."),
INVALID_REQUESTER("0004", "잘못된 요청입니다."),
INVALID_REQUEST("0005", "잘못된 요청입니다."),

2. HTTP Method

이건 예전에 선생님이 가르쳐주신 적 있는데 http 메소드가 종류별로 있구나 ~ 분명 기억했는데 PUT은 기억못하고 POST로 만들어버렸다.. 이제 안까먹을 것임!

PUT은 새로운 데이터로 덮어쓰기 즉 업데이트를 하기 위한 용도로 사용되는 HTTP 메소드! PATCH라는 것도 있는데 이거는 부분적으로 덮어쓸때 사용하고 보편적으로 PUT이 더 흔히 사용됨.

HTTP 메소드로 API의 용도를 구별하면 일일히 매핑 url을 붙여줄 필요 없이 깔끔하게 API를 만들 수 있어서 좋은 것 같음!

@PutMapping("")
public ResponseDto<DiaryDto> modifyDiary(DiaryDto diaryDto) {
    UserDto userDto = RequestContextHelper.getLoginUserInfo();
    return  ResponseDto.ok(diaryService.modifyDiary(userDto, diaryDto));
}

3. 코드 리팩토링

  1. if문의 분기 처리와 들여쓰기가 많아질 수록 코드는 가독성이 떨어지게 되는 것을 주의하자
  2. NullPointerException 예외처리를 꼭 해줄 것 !! 사용자가 사용하는 서비스에서는 매우 매우 주의해야하는 부분
  3. Null 체크를 해주는 편리한 유틸이 있다. 아파치에서 제공하는 StringUtils !!! 이놈아는 빈값과 널체크를 해주질 않나 글자비교도 널체크를 같이 해주질 않나! 예외처리할때 편하다.
public DiaryDto modifyDiary(UserDto userDto, DiaryDto diaryDto) {
    DiaryDto oldDairyDto = diaryMapper.findDiaryByDiaryNo(diaryDto.getDiaryNo());
    if (oldDairyDto == null) {
        throw new BizException(ResultCode.INVALID_REQUEST);
    }
    if (!StringUtils.equals(oldDairyDto.getCreateId(), userDto.getUserId())) {
        throw new BizException(ResultCode.INVALID_REQUESTER);
    }
    diaryDto.setUpdateId(userDto.getUserId());
    Integer row = diaryMapper.updateDiary(diaryDto);
    if (row < 1) {
        throw new BizException(ResultCode.FAILED_SAVE);
    }
    return diaryMapper.findDiaryByDiaryNo(diaryDto.getDiaryNo());
	}
}
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

느낀점

점점 일은 더 바빠지고 많아지지만 그래도 회고는 주기적으로 해야겠다는 생각이 든다. 회고를 해야 내가 공부했던 것들이 제대로 습득되는 느낌. ㅎㅎ 그리고 토이프로젝트 덕분에 실무 능력이 많이 향상되었다는게 느껴진다. 아직 갈길이 멀지만 오늘 회사에서 칭찬을 많이 들어서 기분이 좋았다. 좋은 선생님을 만난 덕분이기도 하고 ! ㅎㅎ 토이프로젝트의 장점은 내가 만들고 싶은 걸 만들기 때문에 재밌게 개발할 수 있다는 것. 그리고 실무에 도움되는 공부가 많이 되는 것 같다. 이제 몸 건강 챙기면서 다시 모든걸 열심히 해보쟈 두벼리 아쟈아쟈뵤!!

0개의 댓글