스프링부트 관련(spring boot, mybatis) (7) 썸네일형 리스트형 [Spring Boot] OAuth 카카오 연동 인증과 로그인 (with next.js) 사이드 프로젝트를 하면서, 카카오 로그인을 구현하게 되어 다음에 또 헤매지 않도록 정리해 둔다.spring security는 사용하지 않고, spring boot 기반으로 구현하였다. 아래는 카카오 개발자 공식 문서에 나와있는 oauth 기반 인증 과정이다.https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api과정을 간단하게 요약해보면,1. 카카오 인증서버로부터 인가 코드를 받는다.2. 받은 코드로 access, refresh Token을 받는다.3. 받은 토큰으로 카카오 유저 정보를 가져온다.4. 유저정보를 이용해 내 서비스에서 로그인/회원가입을 처리한다. (선택) Resource Server - OAuth 2.0 서비스를 제공하고 Resour.. [spring boot] post request에 DTO 사용할때 데이터 넣어도 null 발생 @PostMapping public ResponseEntity saveGame(@Validated @RequestBody GameDto.Request gameDto) { gameService.saveGame(gameDto); return ResponseEntity.status(HttpStatus.CREATED).build(); }위와같이 컨트롤러를 구현한 뒤 postman을 사용해 post request를 요청해 주었는데, 자꾸 데이터가 null로 나오는 문제가 발생했다. 도대체 왜이러나 하면서 빼먹은 부분이 있는지 생각해봤다. 이유는 바로 DTO에 setter가 없었던 것이였다. 데이터를 setter를 이용해 객체를 넣기 때문에 setter가 없으면 값을 할당하지 못해 null이 나오는 것으로 생각.. mybatis에서 ENUM 받아 사용하기 사용자에게 데이터를 받을 때 DTO의 필드에 ENUM이 존재하는 경우가 있다. ENUM을 이용해 동적쿼리를 작성하는 방법을 알아보자. 자동차를 갖고 있다면 자동차 종류를 ENUM으로 사용해 관련된 쿼리를 작성하고 싶을 수 있다. Mapper.java List selectCars(Car car); Car가 Enum이다. Car.java public enum Car { truck, racing, sport; } Mapper.xml ... ... ... ... 이런식으로 하면 된다. 쌍따옴표와 따옴표는 서로 위치가 바뀌어도 상관없다. name 대신 toString을 사용해도 된다. ENUM은 참고 https://stackoverflow.com/questions/12933813/using-enum-parame.. Mybatis에서 Pageable 사용하기 Mybatis를 사용하면서 Pageable을 사용할수는 없을지 알아보았다. 나도 찾아보기 전까지는 JPA에서만 사용할 수 있을줄 알았는데 그게 아니였다. Mybatis에서 Pageable을 사용하는 과정을 정리해 보았다. implementation 'org.springframework.data:spring-data-commons' JPA를 implementation 하지 않고 위 data commons를 이용하면 Pageable을 사용할 수 있다. 게시글 목록 조회에 Pageable을 적용해 보았다. Service public Page getBoards(Pageable pageable) { ... Page page = new PageImpl(ResponseDtoList, pageable, count); .. Mybatis 동적 쿼리, #{}과 ${}의 차이 mybatis를 사용하면서 검색을 구현하려다가 like쿼리에서 에러(Parameter index out of range)가 발생했다. 일반적으로 mybatis에서 인자로 받은 변수는 #{변수명}과 같이 사용한다. 이때 저 변수명은 "문자열"로 출력된다. 만약 문자열이 아니라 안의 글자 값 자체를 그대로 사용하고 싶다면 #대신 $를 사용하면 된다. LIKE "%#{param}%" // 오류 발생 LIKE "%${param}%" LIKE CONCAT('%',#{search},'%') ?(preparedStatement) 부분에 인자로 들어온 문자열이 들어간다. 문자열 안에 문자열을 넣어버려서 에러가 발생했다. 검색 그 자체가 바로 들어가는 것을 볼 수 있다. $를 사용할 경우 SQL Injection 공격을.. bindingResult 가 무엇일까? (feat. Valid) 스프링 부트를 이용해 api를 구현하다보면, 입력값을 받아야 하는 경우가 존재한다. 사용자에게서 데이터를 받아 저장할 일이 반드시 생기기 때문이다. 이 때 사용자가 어떤 데이터를 마음대로 커스텀해서 보낼지 모르기 때문에 반드시 데이터 검증을 해야한다. 스프링부트에서는 검증을 빠르게 해주는 validation이 있다. 단, 2.3이상부터는 따로 분리되었기 때문에 반드시 의존성을 따로 추가해 주어야 한다. implementation 'org.springframework.boot:spring-boot-starter-validation' gradle 내가 정의한 Dto에 @Null과 같은 validation annotation을 붙이고 컨트롤러 인자에 @Valid(자바에서 지원) 혹은 @Validated(스프링.. logger를 사용할 때 static을 붙이고 안붙이고 차이가 무엇일까? 스프링부트를 사용하면서 로그를 찍기위해 서비스에 아래와 같은 로그를 초기화하여 사용하고 있었다. 그런데 사수님께서 static 안붙인 이유가 있는지, static 붙이고 안붙이고의 차이가 무엇인지 물어보셨다. static은 메모리에서 저장되는 위치가 힙 영역이 아니라 데이터 영역(전역변수, static 변수)에 저장되어 여러 클래스 객체를 생성하더라도 하나만 공유한다고 알고 있었다. 그런데 스프링은 빈에 인스턴스를 등록해 싱글톤으로 관리되는데 굳이 static으로 할 필요가 있나? 라는 생각을 갖고 열심히 인터넷을 뒤적거려봤다. 참고에 뒤적거린 사이트들을 적어두었다. static을 사용하면 생기는 장점 1. 잘 알려진 관용구이다. (이게 왜 장점이지?) 2. CPU, Memory 오버헤드가 적다. log.. 이전 1 다음