[Spring Boot] #11 데이터 조회 with JPA

gogori6565·2024년 6월 17일
0

스프링 부트 공부

목록 보기
9/21

👉 Mission. DB속 데이터를 조회하여, 웹 페이지로 확인하시오


데이터 (단일)조회 흐름

Client에서 데이터 요청
→ 요청 url을 Controller가 받음
→ 이 받아진 url에서 찾고자 하는 데이터의 정보를 Repository에게 전달
→ 이를 받은 Repository는 DB에 요청
→ DB는 해당 데이터를 찾아 이를 Entity로 반환
→ 반환된 Entity는 Model을 통해 View template으로 전달
→ 최종적으로, 결과 페이지가 완성되어 Client에게 보내짐


💻 데이터 조회 - 실습

1. 데이터 조회 페이지 설정 (요청 url 받기)

파일명 : controller/ArticleController.java

	@GetMapping("/articles/{id}")
    public String show(@PathVariable Long id){
    
    	//1. id로 데이터 가져오기

        //2. 가져온 데이터를 모델에 등록

        //3. 보여줄 페이지를 설정!
        return "";
    }
  • @GetMapping("/articles/{id}") 에서 {id}는 이 위치에 들어갈 수는 변수라는 의미!
  • @PathVariable : URL 경로에서 변수 값을 추출하여 매개변수에 할당, 경로 변수는 중괄호 {id}로 둘러싸인 값을 나타낸다

[ 데이터 조회를 위한 코드 과정 ]

  1. Repository를 이용해 DB에서 id로 데이터를 가져오기
  2. 가져온 데이터를 Model에 등록하기
  3. 보여줄 페이지 설정하기

2. id로 데이터 가져오기

//1. id로 데이터 가져오기
Article articleEntity = articleRepository.findById(id).orElse(null);

🔴 여기서 잠깐, orElse(null) 없이 코드를 작성하면 오류가 뜨는 이유!

  • 에러 원인: findById(id)Optional<Article>을 반환하기 때문에 Article 변수에 할당할 수 없음.

    Optional 이란, Java 8부터 도입된 클래스로, 특정 값이 있을 수도 있고 없을 수도 있는 상황을 다루기 위해 사용된다.
    즉, 이 상황에서 findById가 id에 해당하는 Article 데이터가 있을 수도 있고 없을 수도 있음으로 나타내는 것!
    따라서 findById의 반환값을 Article 타입 변수에 할당하면, 값이 없을 때 Optional이 null로 처리될 수 있는 것을 무시하게 되어 타입 불일치 에러가 발생함.

  • 해결 방법: Optional<Article>로 타입을 맞추거나, Optional에서 값을 꺼내어 Article 타입으로 사용하기 위해 .orElse(null)을 사용.
    - Optional 사용: 값을 직접 다루기보다 명시적으로 값이 없는 경우를 처리하려는 경우 사용.
    - orElse(null) 사용: Optional을 직접 사용하지 않고 null로 처리하려는 경우 사용.

3. 가져온 데이터 Model에 등록

//2. 가져온 데이터를 모델에 등록
model.addAttribute("article", articleEntity);

4. View 페이지 만들기 (Model에서 던진 Entity를 View페이지에서 사용하는 법)

//3. 보여줄 페이지를 설정!
return "articles/show";
파일명 : resources/templates/articles/show.mustache

{{>layouts/header}}

<table class="table">
    <thead>
    <tr>
        <th scope="col">ID</th>
        <th scope="col">Title</th>
        <th scope="col">Content</th>
    </tr>
    </thead>
    <tbody>
    {{#article}}
        <tr>
            <th>{{id}}</th>
            <td>{{title}}</td>
            <td>{{content}}</td>
        </tr>
    {{/article}}
    </tbody>
</table>

{{>layouts/footer}}
  • Model에 등록된 데이터는 #을 통해 가져올 수 있음
  • {{#article}} ~ {{/article}} 이 사이 코드에서 article을 사용할 것이라는 의미

<결과 화면>


📚정리

[ 데이터 조회 후 페이지에 보여주는 방법 ]

  1. 요청 url을 Controller가 받고
  2. Repository가 찾는 데이터 정보를 DB에서 Entity로 가져오고
  3. 이 Entity를 Model을 통해 View template으로 전달해 결과 페이지 만들기!

강의 출처 : https://www.youtube.com/watch?v=_vDACE13Ubc&list=PLyebPLlVYXCiYdYaWRKgCqvnCFrLEANXt&index=1 [스프링 부트 입문 - 홍팍]

profile
p(´∇`)q

0개의 댓글