TIL 23.01.18

쓰옹·2023년 1월 18일
0

개발자를 향해~~TIL✍

목록 보기
69/87

오늘 한 일
회원가입 기능 구현, 로그인 기능 구현, 에러수정, 요청사항 수정, 로그아웃 레디스 어떻게 해야하는지 구글링/고민, 프로필 설정 구현하려고 노력

  • 로그일 할 때 토큰을 헤더에 넣어서 보내줘야함 참고자료
  1. HttpServletResponse 사용
@PostMapping("/sign-in")
    public ResponseStatusDto signIn(
							@Validated @RequestBody SignInRequestDto signInRequestDto, 
							HttpServletResponse response
		) {
        TokenResponseDto tokenResponse = userService.signIn(signInRequestDto);
        response.addHeader(
							JwtProvider.ACCESSTOKEN_HEADER, tokenResponse.getAccessToken());
        response.addHeader(
							JwtProvider.REFRESHTOKEN_HEADER, tokenResponse.getRefreshToken());
        return new ResponseStatusDto(HttpStatus.OK.toString(), "로그인 성공");    
    }
  1. ResponseEntity 사용
@PostMapping("/sign-in")
public ResponseEntity<String> signIn(
									@Validated @RequestBody SignInRequestDto signInRequestDto)
 {
    TokenResponseDto tokenResponse = userService.signIn(signInRequestDto);
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders
				.add(JwtProvider.ACCESSTOKEN_HEADER, tokenResponse.getAccessToken());
    responseHeaders
				.add(JwtProvider.REFRESHTOKEN_HEADER, tokenResponse.getRefreshToken());
    return ResponseEntity.ok()
            .headers(responseHeaders)
            .body("로그인 성공");
  }
  • logout spring security + jwt + redis
    로그아웃을 하게 되면 accessToken의 남은 유효시간동안 접근을 금지 시키게 하는데 그걸 redis를 이용하여 한다. redis에 blacklist로 등록함. 그 때 accessToken과 남은 유효시간을 저장한다.
    그리고 요청하는 accessToken의 유효시간이 만료되었을 때는 블랙리스트에 등록된 해당 accssToken 값도 자동으로 삭제된다.. https://wildeveloperetrain.tistory.com/61
    아직 더

트러블 슈팅

  • 1 . 에러코드
    2023-01-18 01:34:55.842 ERROR 80732 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] threw exception
    ...
    2023-01-18 01:34:55.842 ERROR 80732 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost]           : Exception Processing ErrorPage[errorCode=0, location=/error]
    
    org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.boot.autoconfigure.h2.H2ConsoleProperties' available ...

→ h2콘솔을 사용할 수 있게 웹이그노어 해놔서 에러가 발생한 것 같은데… 왜??

public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring()
                 .requestMatchers(PathRequest.toH2Console())

application.propertise에 h2 설정을 안해놔서 그럼 그래서 h2설정 넣어줬음

  • 2 . 에러메세지
    GenerationTarget encountered exception accepting command : Error executing DDL "
        alter table user 
           add constraint UK_sb8bbouer5wak8vyiiy4pf2bx unique (username)" via JDBC Statement
    
    org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
        alter table user 
           add constraint UK_sb8bbouer5wak8vyiiy4pf2bx unique (username)" via JDBC Statement
    	at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    	at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:458) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    	at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:442) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    	at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:361) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    	at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:169) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    	at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:138) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    	at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:124) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    	at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:168) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    	at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:85) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:335) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    	at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]
    	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final] ... at com.project.matchingsystem.MatchingSystemApplication.main(MatchingSystemApplication.java:12) ~[main/:na]
    Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000a    alter table [*]user \000a       add constraint UK_sb8bbouer5wak8vyiiy4pf2bx unique (username)"; expected "identifier"; SQL statement:
    
        alter table user 
           add constraint UK_sb8bbouer5wak8vyiiy4pf2bx unique (username) [42001-214]
    	at org.h2.message.DbException.getJd

→ 테이블 생성이 안되서 발생한 에러이다. user가 예약어라 테이블이름을 따로 설정을 해줘야하는데 빼먹음
그래서 @Entity(name = "users") 설정해줌

  • 위에 사용한 ResponseEntity → 회원가입은 responseStatusDto를 사용해서 반환을 해주니까 그냥 이렇게 했을 때랑 바디 반환 형태에 차이가 생겼다. 회원가입 - {"httpStatus" : "200 OK", "message": "회원가입 성공"} / 로그인 - 로그인 성공 그래서 통일을 시켜주기 위해 body에 들어가는 타입을 봤는데 <*T*> *ResponseEntity*<*T*> body(*@Nullable T body*); 이렇게 되어있어서 수정을 해줬다
    @PostMapping("/sign-in")
        public ResponseEntity<ResponseStatusDto> signIn(@Validated @RequestBody SignInRequestDto signInRequestDto) {
            TokenResponseDto tokenResponse = userService.signIn(signInRequestDto);
            HttpHeaders responseHeaders = new HttpHeaders();
            responseHeaders.add(JwtProvider.ACCESSTOKEN_HEADER, tokenResponse.getAccessToken());
            responseHeaders.add(JwtProvider.REFRESHTOKEN_HEADER, tokenResponse.getRefreshToken());
            return ResponseEntity.ok()
                    .headers(responseHeaders)
                    .body(new ResponseStatusDto(HttpStatus.OK.toString(), "로그인 완료"));
        }
profile
기록하자기록해!

0개의 댓글