[우아한테크코스] 5월 18일 TIL

1 minute read

[java] 연산 처리 시간 계산

System.nanoTime(); System.currentTimeMillis();

[test] db간 foreign 키 참조로 인한 문제 해결

문제 상황
db를 지우고 다시 실행하는 과정에 있어서 drop하고 create 하려는데 아래 에러 발생
org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation

해결
cascade 옵션을 줌으로써 해결할 수 있다.
on delete cascade: table 생성 시에 delete할 때 같이 지워라는 옵션을 주는 것
drop table [~~] if exists cascade: ~~ 테이블에 연관성이 있는 db가 있으면 같이 지우라는 옵션 주는 것

@Profile("!test"): dataLoader가 테스트가 아닌 경우에만 실행하라고 주는 애너테이션 @ActiveProfiles("test"): 이것이 test라고 알려주는 애너테이션(application.properties에 spring.profiles.active=test를 주는 방안으로도 해결 가능)

[Spring] session의 사용

@PostMapping("/login/session")
public ResponseEntity<Void> loginSession(@RequestBody TokenRequest tokenRequest, HttpSession session) {
    String email = tokenRequest.getEmail();
    String password = tokenRequest.getPassword();

    if (authService.isValidLogin(email, password)) {
        session.setAttribute("MEMBER", email);
    }

    return ResponseEntity.ok().build();
}

session을 설정하면 알아서 쿠키에 JSESSIONID라는 이름으로 설정된다.
그러고 session.getAttribute("MEMBER")를 하면 저장된 이메일을 얻어올 수 있다.

[Spring] valid 사용 시 Min을 주었을 때 null이 들어온다면?

@Min(value = 1, message = "거리는 1 이상이어야 합니다")
@NotNull(message = "거리를 입력해주세요")    

min은 BigInteger, BigDecimal을 받고 원시타입인 byte, short, long, int를 받아서 null이 들어올 수는 없지만 Min 인터페이스는 null을 유효하다고 본다.
따라서 NotNull 어노테이션도 선언해주는 것이 안전하다.

  • WebConfig에 .allowCredentials(true) 추가, fetch문에 credentials: 'include' 추가
  • CORS(Cross-Origin Resource Sharing)란
    추가 http 헤더를 사용해 어떠한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제이다.
    보안 상의 이유로 브라우저는 교차 출처의 http 요청을 제한한다.
    자신의 출처와 동일한 자원만 불러올 수 있고, 다른 출처를 불러오려면 cors 헤더를 포함한 응답을 반환해야 한다.
    HTTP 요청 메서드에 대해 CORS 명세는 브라우저가 요청을 OPTIONS 메서드로 preflight해 지원하는 메서드를 요청하고, 서버에서 허가되면 실제 요청을 보내도록 요구한다.
    Access-Control-Allow-Origin 헤더를 응답으로 보낸다.

위와 같은 credential 추가를 해주면 Access-Control-Allow-Credentials 옵션이 request 요청의 credentials 헤더가 include이면서 response의 Access-Control-Allow-Credentials 옵션이 true라면 자바스크립트에게 쿠키, 인증 헤더, TLS 클라이언트 인증서를 허용한다.

    public ResponseEntity<TokenResponse> login(@RequestBody TokenRequest tokenRequest, HttpServletResponse response) {
        TokenResponse tokenResponse = authService.createToken(tokenRequest);

        Cookie cookie = new Cookie("MEMBER", tokenResponse.getAccessToken());
        cookie.setMaxAge(60*60);

        response.addCookie(cookie);
        return ResponseEntity.ok().body(tokenResponse);
    }

위와 같이 response에 쿠키를 더해줌으로써 쿠키를 저장할 수 있다.

참고