티스토리 뷰

.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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함