저번 과정 이후로 추가할 기능은 3가지이다.
1. 사용자의 요청 정보가 DB에 저장된다.
2. 사용자에게는 OPEN API의 응답을 가공하여 , JSON 형태로 RESPONSE BODY에 저장하여 보여준다.
3. 사용자는 본인이 언제의 정보를 요청했었는지를 DB를 통해 확인할 수 있다.
1.
가장 먼저, 사용자의 REQUEST를 DB에 저장할 수 있게 ENTITY와 TABLE을 사용했다.
METHOD에 대한 설명은 나중에하고, 이렇게 JPA REPOSITORY를 EXTENDS한 REPOSITORY를 생성했다 .
많은 고민을 했는데, 사용자 정보 DB저장 -> OPEN API의 RESPONSE 전달을 한 TRANSACTION으로 묶기 위해
CONTROLLER 단에서 동시 구현했다.
RESPONSE ENTITY의 형태로 RESPONSEVO를, HTTPRESPONSE의 BODY 부분에 JSON으로 변환 시켜 넣는다.
***JPA REPOSITORY를 사용할때 주의해야 했던 점
1. FIELD와 METHOD의 대 소문자 문제.
밑 내용이 CLASS의 FIELD,위 내용이 METHOD가 된다.
FIELD는 소문자로, METHOD는 맞추어 대문자로 설정해야 JPA가 알아서 찾아준다.
(JPA는 정말 자동으로 해주는게 많고, 그렇기 떄문에 해당 꼴을 꼭 준수하자. )
2. 만약 METHOD가 여러가지라면, 해당 METHOD들의 순서 또한 FIELD의 순서와 맞추어 줘야 한다.
3. DB의 TABLE이 될 CLASS는, 그 변수명 등이 예약어여선 안된다.
이는 기본적인 것이지만, DB의 예약어가 굉장히 많은 편임에 주의하자.
내가 변경한 예약어는 1, ORDER 2. KEY 3.stdHour등이 있다. (3번은 확실하진 않다)
이제 3번째 기능을 구현해보자 .
sdate로 찾을 수 있게 했다. (레퍼지토리의 기능을 또다시 추가한 이유는, repository를 직접적으로 controller단에서 사용하지 않기 위함이다)
1. restcontroller를 통해, HTTP의 응답 형태로 제출한다. (일반 CONTROLLER는 보통 HTML을 띄우거나 MODEL AND VIEW로 RETURN한다)
2. REPOSEENTITY를 활용하여 , HTTP BODY에 원하는 객체를 JSON 형태로 RETURN 한다.
3. REQUESTPARAM을 통해 DATE라는 값을 저절로 찾아서, 대입하게끔 한다.
(value = "date"로 사용자 요청의 date를 확인해, 내 변수 date에 대입한다. )
(현재는 간단한 get만 사용했지만, post 등의 method를 사용할때는 @responsebody를 사용해
json에서 원하는 객체로 mapping해준다. @Responsebody User user 등. )
#추가 (tostring)
ResponseVo responseVo = new ResponseVo() ;
if (weatherResponseVo.getList().isEmpty()) {
throw new Exception();
} else {
responseVo.setCode("ok");
responseVo.setMessage(weatherResponseVo.getList().toString());
}
public class WeatherResponseVo {
int count ;
ArrayList<WeatherDetailVo> list;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WeatherDetailVo {
String unitCode ;
String unitName ;
String routeName;
String xValue ;
String yValue;
String cloudValue ;
String snowValue ;
}
이런식으로 하였는데 어떻게 tostring을 @data를 선언하지 않았는데 가능하지? 라고 생각했지만.
사실은, weatherdetail의 list를 tostring 한 것이기 떄문에 weatherdetail에만 @data를 붙여주면 되는 것이 맞다!
#고민해야 할 점
1. 현재는 객체를 받아서 그것을 바로 db에넣었고, 이 이유는 하나의 트랜잭션으로 묶기 위함이다.
허나 id가 db에 save될때 자동생성되므로, 악성 user가 자기가 생성한 id를 db에 삽입할 수 있는 문제가 있다.
2. open api가 날짜가 다르면 null을 return하고, 심지언 날짜가 정상적이어도 저장한 정보가 없으면
null을 return하는 등, return의 경우가 많다. 이럴때 db에 저장해야할지 아닐지는.. 고민해봐야 한다.
3. 현재 실제 open api 형태가
"count": 187,
"list": [
{
"unitName": "죽전휴게소",
"unitCode": "002 ",
"routeName": "경부선",
"routeNo": "0010",
"stdHour": "10",~~~ }
형태이다.
그렇기 떄문에 response를 count ,list로 . list안의 정보를 weatherdetail로 표현하였다.
그리고 나서는 해당 response를 string으로 바꾸어 message로, 문제 없다는 것을 표현하는 code를 만들어 최종 responsevo를 만들었다.
즉 정리하자면, 실제 openapi와 똑같은 형태를 만들고, 그 객체를 string으로 변환하여 내가 원하는 객체로 만들어, 이를 json 형태로 제공했다. 해당 방식에 대한 더 좋은 방식을 고민할 필요가 있다.
'프로젝트 > 클론프로젝트' 카테고리의 다른 글
OPEN API / 활용한 공공데이터로 날씨 불러오기 (1) | 2024.01.28 |
---|---|
개인 보안 노트 프로젝트 작성 과정 , 느낀점 (0) | 2024.01.11 |
개인 보안 노트 서비스 (0) | 2024.01.08 |
개발자 키우기 프로젝트 (0) | 2023.12.27 |
to do list (1) | 2023.12.20 |