티스토리 뷰
.domain 패키지 내의 Timestamped
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Timestamped {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime modifiedAt;
}
1. @Getter 선언.
2. @MappedSuperclass로 자동으로 컬럼 인식
3. @EntityListeners로 생성, 변경 시간 자동으로 업데이트
Application.java
@EnableJpaAuditing
@SpringBootApplication
public class Week03Application {
public static void main(String[] args) {
SpringApplication.run(Week03Application.class, args);
}
}
@EnableJpaAuditing 생성, 수정 시간이 바뀌었을 떄 자동으로 업데이트 하게 하는 어노테이션
NullPointException: 찾는 대상이 없음을 알려주는 오류
IllegalArgumentException: 전달받은 파라미터에 오류가 있다.
@RequiredArgsConstructor //생성자
@Service
public class MemoService {
private final MemoRepository memoRepository;
@Transactional
public Long update(Long id, MemoRequestDto requestDto) {
Memo memo = memoRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
);
memo.update(requestDto);
return memo.getId();
}
}
final로 선언해준 memorepository를 생성할 때 무조건 같이 넣어줌
@PutMapping("api/memos/{id}")
private Long PutMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto){
memoService.update(id, requestDto);
return id;
}
주소에 있는 id를 받기 위해 @PathVariable로 파라미터를 받는다.
@RequestBody는 전해주는 데이터.
POST 요청중 500에러 발생
application property
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL
spring.jpa.show-sql=true
을 해도 안 됐는데 MemoRequestDto의 contents 멤버 변수가 Contents로 되어있어서 발생한 문제였다.
Repository Controller Service
Repository: DB 접근
Service: Controller와 Repository의 중간 역할
Controller: 자동 응답기
curl "https://openapi.naver.com/v1/search/shop.xml?query=%EC%A3%BC%EC%8B%9D&display=10&start=1&sort=sim" \
-H "X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 client id 값}" \
-H "X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 client secret 값}" -v
-H header 요청하는 것에 대한 부가 정보
public class NaverShopSearch {
public String search() {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "DJLxKdVYUCvfAt9XUdSM");
headers.add("X-Naver-Client-Secret", "RftaKEfafe");
String body = "";
HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=아디다스", HttpMethod.GET, requestEntity, String.class);
HttpStatus httpStatus = responseEntity.getStatusCode();
int status = httpStatus.value();
String response = responseEntity.getBody();
System.out.println("Response status: " + status);
System.out.println(response);
return response;
}
public static void main(String[] args) {
NaverShopSearch naverShopSearch = new NaverShopSearch();
naverShopSearch.search();
}
status 변수는 200으로 페이지가 잘 나오는지, 아니면 404로 페이지가 로드되지 않는지 확인한다.
response는 검색 결과를 String으로 받아주는 것
String을 JSON 데이터로 변환
// https://mvnrepository.com/artifact/org.json/json
implementation group: 'org.json', name: 'json', version: '20160810'
그래들 dependancies 에 붙여 넣고 빌드하기
requestDto는 정보를 받아올 객체이기에 이전에는 생성자에 매개변수를 붙여줄 필요가 없었지만
package com.sparta.week04.models;
import lombok.Getter;
import org.json.JSONObject;
@Getter
public class ItemDto {
private String title;
private String link;
private String image;
private int lprice;
public ItemDto(JSONObject itemJson) {
this.title = itemJson.getString("title");
this.link = itemJson.getString("link");
this.image = itemJson.getString("image");
this.lprice = itemJson.getInt("lprice");
}
}
위의 ItemDto는 NaverShopSearch에서 조회 정보를 받아오기 때문에 파라미터가 필요하다.
controller 패키지 안 SearchRequestController
@RequiredArgsConstructor // final 로 선언된 클래스를 자동으로 생성합니다.
@RestController // JSON으로 응답함을 선언합니다.
public class SearchRequestController {
private final NaverShopSearch naverShopSearch;
@GetMapping("/api/search")
public List<ItemDto> getItems(@RequestParam String query) {
String resultString = naverShopSearch.search(query);
return naverShopSearch.fromJSONtoItems(resultString);
}
1. private final로 등록된 NaverShopSearch는 @component 어노테이션으로 컴포넌트화가 되었기에 final 변수를 붙여도 오류가 나지 않는 것.
2. getItems 메소드의 매개션수 String query는 url에서 받아오는 정보이므로 기존에 사용하던 @RequestBody 어노테이션이 아닌 @RequestParam 어노테이션을 사용한다.
3. naverShopSearch의 search 메소드는 "https://openapi.naver.com/v1/search/shop.json?query=" 의 결과 값을 String으로 return하는 메소드이다.
4. naverShopSearch.fromJSONtoItems 메소드는 search 메소드의 String 결과 값을 Json화 하여 이를 ItemDto리스트로 만들어주는 메소드이다.
function addHTML(itemDto) {
/**
* class="search-itemDto" 인 녀석에서
* image, title, lprice, addProduct 활용하기
* 참고) onclick='addProduct(${JSON.stringify(itemDto)})'
*/
let title = itemDto.title;
let link = itemDto.link;
let image = itemDto.image;
let lprice = itemDto.lprice;
let temp_html = `<div class="search-itemDto">
<div class="search-itemDto-left">
<img src="${image}" alt=${link}>
</div>
<div class="search-itemDto-center">
<div>${title}</div>
<div class="price">
${lprice}
<span class="unit">원</span>
</div>
</div>
<div class="search-itemDto-right">
<img src="images/icon-save.png" alt="" onclick='addProduct(${JSON.stringify(itemDto)})'>
</div>
</div>`
return temp_html
}
관심상품 저장하기 버튼 $('#search-itemDto-right') > img의 클릭이벤트 addProduct()는 관심상품을 DB에 저장하는 함수다. itemDto는 Json 형태이므로, 이를 매개변수로 가져가면 오류가 발생한다. 따라서 JSON.stringify 작업이 필요하다.
'항해99(7기) > 항해 3주차' 카테고리의 다른 글
항해99(7D) 3주 마지막날 (0) | 2022.05.27 |
---|---|
항해99(7D) 3주 3일차 (0) | 2022.05.23 |
항해99(7기) 3주 1일차 (0) | 2022.05.20 |