이번에는 MySQL 연동과 스웨거를 통한 테스트를 진행했다.
테스트는 Junit으로 하면 DB에 SQL 쿼리를 작성하지 않아도 되어서 그전에 SQL 공부를 위해 DB를 먼저 변경하기로 결정했다.
- 연동
https://datarian.io/blog/installing-mysql-on-windows?utm_source=home-copy&utm_medium=home-copy
윈도우에 MySQL 설치하기
윈도우에 MySQL과 MySQL Workbench를 설치해보겠습니다.
datarian.io
설치는 이 블로그를 보고 따라갔다.
막상 설치하고 나니 빈화면이라 매우 당황했다.
- 의존성 주입

의존성 주입 대부분은 제미나이한테 물어보고 진행했다.
블로그에 보니 전에 쓰던 것과 최신 것이 섞여있어서 교차 검증을 하며 진행했다.

설치할 때 정했던 비밀번호를 입력해주고
ddl-auto 부분을 update로 한다!
- Create: 있던 테이블을 없애고 새로 만들어버린다.
- Update: 테이블이 있다면 기존의 것을 사용한다. 없다면 새로 생성한다.
처음에 서버를 껐다 켰을 때 로그가 안 떠서 당황했는데 서버가 작동할 때 이미 테이블이 생성되었던 것이었다.

이 로그를 보면 내가 짰던 엔티티 코드와 동일하게 진행되는 것을 알 수 있다.
MySQL은 데이터를 보존하고 있어서 다음에 진행할 때 이런 로그는 따로 뜨지 않는다.
- SQL 문법
테이블을 생성했기 때문에 문법으로 데이터를 넣어두고 스웨거에서 요청을 보내서 잘 작동하는지 테스트해봤다.

먼저 테이블 데이터를 넣어준다.
- 테이블 데이터 삽입
-- 필드 몇개만 정하여 넣을 때
INSERT INTO 테이블이름(필드이름1, 필드이름2, 필드이름3, ...)
VALUES (데이터값1, 데이터값2, 데이터값3, ...)
-- 필드 전체를 넣을때 (필드명 생략 가능)
INSERT INTO 테이블이름
VALUES (데이터값1, 데이터값2, 데이터값3, ...)
왼쪽 사이드바에 나와있는 스키마랑 같은 이름으로 해준다!


데이터가 제대로 저장이 된다.
- 테이블 데이터 업데이트
UPDATE 테이블이름
SET 필드이름1=데이터값1, 필드이름2=데이터값2, ...
WHERE 필드이름=데이터값; -- 조건식을 꼭 작성해야 한다!!
UPDATE 에서 WHERE 조건절을 빼면 모든 멤버의 데이터가 바뀌는 일이 일어난다.
테이블 전체 레코드가 바뀐다!!
- 전체 테이블 조회
SHOW TABLES
윈도우 환경에서의 MySQL에서는 데이터베이스의 이름에 대소문자를 구분하지 않는다.
그러나 데이터베이스의 이름은 가독성 측면에서 대소문자를 구분하여 사용하는 것이 좋다!
- 문제해결
포인트 이력을 불러오는 API에서 오류를 발견했다.
- NumberFormatException
- 쉽게 말해 숫자가 아닌 문자열에서 정수로 바꿀 때 일어나는 오류이다.
- 자바 코드와 데이터베이스 간의 데이터 타입이 맞지 않을 때 발생할 수 있다.
- 스프링 데이터 JPA를 사용해서 메서드를 작성해서 바로 CRUD를 구현할 수 있었다.
내 코드에서 PointHistoryRepository에 있는 메서드는 findById 였다.
- findById / JpaRepository가 기본으로 제공하는 메서드
- repository.findById: 해당 레포지토리가 관리하는 기본 키(pk)를 찾는다.
- 스프링은 테이블 고유의 아이디를 찾는 것이다. 주로 정수형이나 Long 타입을 사용한다.
- findByMemberId / 내가 직접 이름을 지어준 쿼리 메소드
- repository.findByMemberId: 해당 테이블 내의 있는 특정 필드를 찾는다. 지금의 경우엔 외래 키(FK)인 member아이디로 구분하고자 했다.
- 결론: findById('user1') 을 사용해서 NumberFormatException 가 발생했다!
- 구매 로직 테스트

쿠폰 상점에 있는 아메리카노 교환권을 구매한다.



쿠폰 영수증과 포인트 이력, 회원 포인트까지 잘 갱신되는 것을 볼 수 있다.
다음에는 Junit으로 테스트를 진행하고 프론트에 화면을 띄우는 작업까지 해볼 예정이다.