mySQL 사용하기
오늘은 H2DB를 벗어나서 MySQL로 DB를 연동시켜볼까 한다.
기본적으로는
https://chaeyami.tistory.com/244
[SpringBoot] JPA + MySQL 연동
MySQL과 Workbench 설치MySQL 설치하기 [MySQL] MySQL, MySQL Workbench 설치하기2024.04.19 글 업데이트! 업데이트 내용 : MySQL 버전. 끝. 다운로드 링크 : https://dev.mysql.com/downloads/windows/installer/8.0.html MySQL :: Download
chaeyami.tistory.com
이 블로그를 참고했고, 몇 가지 나의 상황에 맞게 추가설정을 했다. (GPT 돌렸습니다)
우선 build.gradle 설정까지는 따라했고,
yml 파일 설정은
jpa:
database-platform: org.hibernate.dialect.MySQLDialect
hibernate:
ddl-auto: update
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
properties:
hibernate:
format_sql: true
default_batch_fetch_size: 1000
datasource:
url: jdbc:mysql://localhost:3306/hongchelin
driver-class-name: com.mysql.cj.jdbc.Driver
username: #
password: #
이렇게 했다.
username과 password에는 mySQL 계정의 이름과 비밀번호를 입력해야하며, 그렇지 않을 경우 에러가 터진다.
그리고나서 바로 연결하면 또 에러가 터지는데,

커넥션을 만든 후에 커넥션 밑에 스키마에 내가 관리할 DB가 들어간다. 커넥션 하나는 DB가 아니다...!
CREATE DATABASE (DB이름) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
이런식으로 mySQL의 쿼리입력창에 이 쿼리문을 입력하면 그제서야 DB가 만들어지고 스프링과 연결할 수 있다.
DB이름은 .yml 파일에서 spring:datasource:url 에 입력한 것과 같아야하는지까지는 모르겠다. 난 같았음
그리고 마지막으로 DB가 hongchelin과 sys (를 비롯한 여러 DB가 있을때)
Member 테이블을 확인하기 위해 무턱대고 SELECT 문을 치면 에러가 터져서 어느 DB를 확인해 줄 것인지 미리 명시를 해야한다.
use hongchelin
이렇게 하고나서 H2DB에서 했던 것처럼 확인도 하고 하면 된다.

이렇게하면 H2DB와 큰 차이 없이 기능이 작동하는 것을 알 수 있다.

테이블 이름을 입력할 때 H2DB는 STORE_FOR_VOTE로 입력해야했지만 mySQL은 STOREFORVOTE라고만 입력해야한다. H2DB처럼 입력하면 찾지 못한다.
CustomException 처리하기
지금까지 CustomException을 UnauthorizedException 하나만 있어서 모든 에러를 UnauthorizedException 하나만으로 처리했는데 좀 더 다채로운 에러메시지를 위해서 CustomException을 몇 개 만들까한다.

UnauthorizedException을 31번씩이나 이용하다니.. 그 중 3개는 전역Exception 처리이고 한 1/3은 import 문에서 사용한 것이다.
해야할 것은 customException을 추가하고 빈 생성자만 만든 후에 전역Exception으로 처리해주면 된다.
1. CookieNotFoundException
가장 최근에 추가된 OAuth - DB 연동 기능에서는 쿠키를 조작해야한다. 그런데 쿠키가 없으면? 당연히 NPE가 터지고 터지기 전에 내가 customException을 만들어서 처리해야한다.
@ExceptionHandler(CookieNotFoundExcpetion.class)
public ResponseEntity<ResponseDTO> cookieNotFoundException(
CookieNotFoundExcpetion ex
) {
ResponseDTO responseDTO = ResponseDTO.builder()
.status(400)
.message("데이터가 존재하지 않습니다.")
.build();
return new ResponseEntity<>(responseDTO, HttpStatus.BAD_REQUEST);
}
이런식으로 쭈루룩 만들어나가면 된다.
2. CannotFoundDbElementExcpetion
잘못된 DB 테이블에 조회를 시도한 경우는 SQLException이 터지지만, DB에 없는 데이터를 가지고 DB에서 '이 데이터가 이 컬럼에 있는지 찾아줘'하면 null이 반환된다. Optional을 써야하는데.. 하필 JPA 처음 쓸 때 작업해가지고 몇 개의 레포지토리는 Optional이 아니라 그냥 데이터를 반환한다.
암튼 이렇게 null이나 Optional.isPresent() 가 false인 경우에는 NPE가 터지지 않도록 CannotFoundDbElementException을 쓰기로한다.
생각보다 많을 줄 알았는데, 의외로 UnauthorizedException이 쓰이는 곳도 많고, 기존 에러 (IllegalStatement 같은거) 를 써도 되어서 커스텀에러가 많이 필요하지는 않았다. 아싸
지도에서 상점 긁어오기
이거는 카카오지도 API에 요청을 보내서 처리해야하는데,
URL은 다음과 같다.
https://dapi.kakao.com/v2/local/search/category.json
?category_group_code=FD6
&x={경도}
&y={위도}
&radius={반경}
&page={페이지}
&size={페이지당개수}
이런식으로 요청을 보내면 된다.
https://apis.map.kakao.com/web/documentation/#CategoryCode
위에 링크를 타고 들어가면 ?category_group_code 에 들어갈 값들이 있다. FD6가 음식점, CE7 카페가 필요하다.

신기한 점은 카테고리만 FD6으로하고 POSTMAN으로 요청을 보내면 성심당이 1번으로 뜬다ㄷㄷ
갓 심 당
암튼 저러면 안되니
주 간 회 고 록 쓰 는 데 2 시 간 이 걸 렸 어 미 친
위도 경도와 반경만 알면된다. 그 중에서 위도 경도는
https://dapi.kakao.com/v2/local/search/address.json?query=마포구와우산로94
이 링크로 GET 요청을 보내면 알 수 받을 수 있다.

이렇게 요청이 오니 확인할 수 있다.

?
총개수가 62만개라서 뭐지 싶었는데 radius 설정을 안넣어주어서 그냥 닥치는대로 가져온듯하다.

2km 제한을 두고 났더니 6139개로 줄었다.
이제 이 페이지들을 하나한 불러와서 DB에 저장해주면 된다. 6139개를 한 번에 45개씩 불러올 수 있으니 140번 정도면 얼추 다 불러올 수 있다. 3000번까지 무료라고한다 꺄르륵

이렇게보니까 2km까지는 너무 길고 1km~1.5km 정도로 설정해야할 것 같다. 한 1.3km 정도가 적당한 듯하다.

반경을 1300m로 수정한 결과
이제 확실히 100번 안에 불러올 수 있을듯하다.
이제 스프링에서 요청을 보내고 값을 받아오는 것부터 해야한다.
이거 처음 배울 때 백엔드는 값을 받았다고 상정하고 코드를 짜야한다!는 것을 몰라서 무턱대고 구글에 스프링 POST 요청 보내기, GET 요청 보내기 이런거부터 검색했는데 그 때 생각하면 참... (할많하않)
암튼 이제는 진짜로 GET 요청을 보내야한다.
저 요청에서 meta에 저장된 is_end 값이 true 일 때까지 반복문을 돌릴 것이다.
그리고 WebClient 객체를 통해서 GET 요청을 보낼 생각이다.
근데 너무 피곤해. 내일 코어타임 가야해서 우선 여기서 마무리
'팀 프로젝트 > [2025][GDG]홍대 맛집 아카이빙 프로젝트' 카테고리의 다른 글
| [GDG] 개발코스 6주차 WIL (0) | 2025.08.20 |
|---|---|
| [GDG] 홍대 맛집 아카이빙 프로젝트 #21 - 카카오지도 API 짧게 (2) | 2025.08.18 |
| [GDG] 홍대 맛집 아카이빙 프로젝트 #19 - OAuth 되살리기 및 정규화 보강하기 (3) | 2025.08.16 |
| [GDG] 홍대 맛집 아카이빙 프로젝트 #18 - OAuth와 DB 연동하기 (2) | 2025.08.15 |
| [GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #6.2. - Redis (1) | 2025.08.11 |