🔙 Backend

    [JUnit5][SpringBoot][Kotlin] Exception테스트하기 (assertThrows)

    [JUnit5][SpringBoot][Kotlin] Exception테스트하기 (assertThrows)

    JUnit4 Junit4에서 exception 테스트는 @Test(expected=기대하는예외)를 통해 가능하다. (JUnit5와 비교하기 위한 예시코드이므로 정확하진 않을 수 있음) @Test(expected = NotEnoughStockException::class) fun 상품주문_재고수량초과() { val member = createMember("사용자") val book = createBook("도서명", 10000, 10, "저자명", "12345") val orderCount = 11 orderService.order(member.id!!, book.id!!, orderCount) fail("예외가 발생해야 한다."); } JUnit5 @Test에 expected를 쓸 수 없게 되어있어 다른..

    [Spring Boot] 오류: Cannot construct instance of (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

    [Spring Boot] 오류: Cannot construct instance of (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

    정말 오랜만에 작년에 진행했던 프로젝트의 서버를 다시 살려보았다. 겨우 살리는데는 성공을 했는데, API호출을 해보니 500에러가 난다!ㅠㅠ 🚨 에러메세지 Cannot construct instance of `model` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 문제가된 'model' 위치에는 req, res에 사용되는 dto class가 있었다. import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lom..

    [Mysql] 날짜 시간 더하기, 빼기 (DATE_ADD, DATE_SUB)

    [Mysql] 날짜 시간 더하기, 빼기 (DATE_ADD, DATE_SUB)

    특정 날짜, 시간에서 일정 초,분,시간을 더하거나 빼야하는 경우 더하기 DATE_ADD(날짜 시간, INTERVAL 숫자 단위) SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND); # 1초 SELECT DATE_ADD(NOW(), INTERVAL 1 MINUTE); # 1분 SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR); # 1시간 빼기 DATE_SUB(날짜 시간, INTERVAL 숫자 단위) SELECT DATE_SUB(NOW(), INTERVAL 1 SECOND); # 1초 SELECT DATE_SUB(NOW(), INTERVAL 1 MINUTE); # 1분 SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR); # 1시간 NOW()..

    [Mysql] mysql에서 현재 연결된 connection 찾기

    Node.js와 Mysql사이에 발생한 Connection lost 문제를 알아보던 중 사용한 mysql 명령어들을 정리한다. 현재 연결된 Thread 개수 show status like 'Threads_connected'; 현재 실행중인 Thread 개수 show status like 'Threads_running'; 최대 가능한 connection 개수 show variables like 'max_connections'; 현재 연결된 connection 목록 show full processlist;

    [NestJS] .env사용하기

    환경변수를 사용하시 위해 Node.js에서는 dotenv를 사용하는데, NestJS에서 @nestjs/config를 사용하면 된다. (@nestjs/config에서도 내부적으로는 dotenv를 사용한다.) 1. @nestjs/config를 설치한다. $ npm i @nestjs/config 2. app.module.ts의 imports에 ConfigModule을 추가한다. app.module.ts import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ConfigModule.forRoot()], controllers: [], providers: [], }) export..

    [MySql] 숫자/문자 자리수 맞추기 (LPAD, RPAD)

    날짜의 경우, 주로 고정된 자리수로 표기하게 된다. 한자리 숫자인 경우 앞에 0이 붙어야한다. 예를 들어 2-28로 표기하지 않고, 02-28과 같이 표기하는 것을 sql을 이용해보면 LPAD('값', '2', '0') # 값, 자리수, 빈값에 넣을 문자 LPAD는 자리수를 맞추고, 남은자리에 3번째 파라미터의 값을 채워넣게된다. SELECT LPAD(2, '2', '0'); # result: '02' SELECT LPAD(1, '5', '0'); # result: '00001' LPAD는 왼쪽이라면, RPAD는 값의 오른쪽에 자리수를 맞춰서 문자를 넣는다. SELECT RPAD(1, '2', '0'); # result: '10' SELECT RPAD(100, '5', '0'); # result: '10..

    [MySql] GROUP BY 내부 정렬하기

    [MySql] GROUP BY 내부 정렬하기

    각 그룹내에서 랜덤한 행, 또는 특정조건으로 정렬을 해야하는 경우 나는 seedIdx컬럼으로 GROUP BY를 하고, 그룹내에서 stage를 랜덤하게 추출하고 싶다. SELECT * FROM PlantImg; 아주 단순하게 생각해서, 정렬(ORDER BY)과 그룹화(GROUP BY)를 동시에 해보면 SELECT idx, seedIdx, stage FROM PlantImg GROUP BY seedIdx ORDER BY RAND(); 이렇게 GROUP BY가 먼저 수행되기때문에 그루핑된 행들이 정렬되게 된다. 그래서 stage는 내부에서 정렬이 되지 않고 모두 각 그룹의 첫번째 행인 stage=1이 나오게 되었다. 해결방법 SELECT seedIdx, (SELECT stage FROM PlantImg WHE..

    [JUnit] assertThat deprecated

    Test코드를 작성하던 중에, assertThat에 빨간줄이 떠서, 아래와 같이 import했더니 assertThat은 deprecated되었다고 뜬다. import org.junit.Assert.*; 해결 import static org.assertj.core.api.AssertionsForClassTypes.assertThat; assertj를 import한 뒤, assertThat을 사용할 수 있다!

    [Spring Boot] 카카오 로그인 API 구현 (2) - Access token으로 사용자 정보 가져오기

    [Spring Boot] 카카오 로그인 API 구현 (2) - Access token으로 사용자 정보 가져오기

    *만약 클라이언트 개발자가 따로 있다면 클라이언트 쪽에서 access_token을 전달해주기 때문에 이 포스팅부터 수행하면 된다. 만약 혼자 구현해야한다면 아래 글부터 진행하여 테스트할 수 있다. 카카오 로그인 API 구현(1) https://suyeoniii.tistory.com/79 [Spring Boot] 카카오 로그인 API 구현 (1) - Access token 발급받기 Spring Boot를 이용해서 카카오 로그인을 구현해보았다. Node.js로 구현할 때보다 복잡해보였는데, 구현하고 나니까 그래도 생각보단 덜 복잡했다! 동작 흐름 카카오를 이용한 소셜로그인 구현 Flow이 suyeoniii.tistory.com 이제 access_token을 받았으니, 이 token을 이용해서 카카오 서버에서..

    [Spring Boot] 카카오 로그인 API 구현 (1) - Access token 발급받기

    [Spring Boot] 카카오 로그인 API 구현 (1) - Access token 발급받기

    Spring Boot를 이용해서 카카오 로그인을 구현해보았다. Node.js로 구현할 때보다 복잡해보였는데, 구현하고 나니까 그래도 생각보단 덜 복잡했다! 동작 흐름 카카오를 이용한 소셜로그인 구현 Flow이다 이건 네이버도 비슷하다! Apple은 조금 다를 듯 1. 클라이언트 쪽에서 로그인을 한다 2. 카카오 서버는 redirect url로 code를 전달해준다 3,4. code를 이용하여 access_token을 발급받는다 5. access_token을 서버로 전송한다 6,7. 서버에서는 받은 access_token을 이용하여 카카오 서버에서 사용자 정보를 받는다 8. 받은 사용자 정보를 이용하여 회원가입 또는 로그인을 진행한다 9. JWT등과 같이 사용자 식별 정보를 클라이언트로 보낸다 혼자 프론트..