- 데이터 조회 과정
- 사용자가 데이터를 조회해 달라고 웹 페이지에서 URL 요청을 보냄
- 서버의 컨트롤러가 요청을 받아 해당 URL에서 찾으려는 데이터 정보를 리파지터리에 전달
- 리파지터리는 정보를 가지고 DB에 데이터를 조회
- DB는 해당 데이터를 찾아 이를 엔티티로 반환
- 반환된 엔티티는 모델을 통해 뷰 템플릿으로 전달
- 최종적으로 뷰 페이지가 사용자 화면에 출력
- 단일 데이터 조회하기
- URL 요청 받기
- 조회할 데이터가 Article 이므로 controller패키지 안에있는 ArticleController 코드 열기
- URL 요청을 받기위해 @GetMapping()어노테이션 작성한 후 ID에 따라 요청을 받기로 했으므로 괄호안에 "/articles/{id}" 를입력
- 중괄호 안에 id를 적으면 이 id는 변수로 사용됨
- URL 요청을 받아 수행할 show()메서드를 생성 . 이 메서는 URL에 있는 id를 매개변수로 가져오기에 id값 앞에 @PathVariable 어노테이션을 사용함
- @PathVariable : URL 요청으로 들어온 전달값을 컨트롤러의 매개변수로 가져오는 어노테이션
- 컨트롤러가 id를 잘 받았는지 로깅을 이용해서 확인하기
- URL 요청 받기
- 데이터 조회해 출력하기
- id를 조회해 DB에서 해당 데이터 가져오기
- articleRepository를 입력하고 점(.)을 찍으면 사용할 수 있는 메서드 목록이 나오는데 이중에서 findById(Long id)를 선택
- findbyId()는 JPA의 CrudRepository가 제공하는 메서드로 특정 엔티티의 id값을 기준으로 데이터를 찾아 Optional 타입으로 반환
- Optional<Article> articleEntity = articleRepository.findById(id);으로 작성
- 하지만 여기서는 코드 뒤에 orElse()메서드를 추가하고 매개변수로 null값을 넣음
- Article articleEntity = articleRepository.findById(id).orElse(null); 식으로 코드 작성
- id값으로 데이터를 찾을때 id값이 없으면 null 반환 , 결과가 있으면 articleEntity 에 변수값을 넣음이라는뜻
- articleRepository를 입력하고 점(.)을 찍으면 사용할 수 있는 메서드 목록이 나오는데 이중에서 findById(Long id)를 선택
- 가져온 데이터를 모델에 등록
- 모델을 사용하기 위해 show()메서드의 매개변수로 model 객체를 받아옴
- 모델에 데이터를 등록할 때는 addAttribute() 메서드를 사용
- 조회한 데이터를 사용자에게 보여 주기 위한 뷰 페이지를 만들고 반환
- 템플렛 아래에있는 articles라는 디렉터리 안에 show 라는 파일을 반환하기위해
- articles라는 디렉터리 안에 show.mustache파일 생성
- 전에 만들었던 header,footer 레이아웃 추가
- header , footer 레이아웃 안에 부트스트랩으로 테이블 코드 추가
- 모델에 article이라는 이름으로 articleEntity를 등록했기에 뷰 페이지에서 머스테츠 문법인 이중중괄호({{}})을 이용해 출력
- {{#article}} {{/article}}와 같이 샵(#)을 이용해 열고 슬래시(/)를 이용해 닫는다.
- 이렇게 가져온 데이터를 여러 행에 걸쳐 사용할 때는 어디에서 어디까지 사용할지 범위를 지정
- 실행해보면 Article 엔티티에 기본 생성자가 없어서 에러가남
- 기본 생성자 추가하기
- 기본 생성자를 추가하기위해 entity 패키지 안에있는 Article 파일 열기
- 기본 생성자란 생성자인데 매개변수가 아무것도 없는 생성자를 의미
- 기본 생성자는 롬복으로 간단하게 생성가능 @NoArgsConstructor을 추가하면 됨
- 기본 생성자를 추가하기위해 entity 패키지 안에있는 Article 파일 열기
- 기본 생성자 추가하기
- id를 조회해 DB에서 해당 데이터 가져오기
// 부트스트랩까지 적용한 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>
<tr>
<th scope="row">1</th>
<td colspan="2">제목 1111</td>
<td>내용!!!!</td>
</tr>
</tbody>
</table>
{{>layouts/footer}}
//머스테츠 문법을 사용해서 테이블 생성
{{>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}}
- 데이터 목록 조회하기
- 단일 데이터는 리파지터리가 엔티티를 반환
- 데이터 목록을 조회하면 엔티티의 묶음인 리스트를 반환
- URL 요청받기
- ArticleController을 열고 show()메서드 아래 index()메서드 추가
- index() 메서드에 @GetMapping("/articles") 선언
- 데이터를 조회해 출력하기
- DB에서 모든 Article 데이터 가져오기
- articleRepository입력하고 점(.)을 찍어 findAll()메서드 선택
- findAll()메서드는 해당 리파지터리에 있는 모든 데이터를 가져오는 메서드
- 이 메서드를 수행한 결과를 articleEntityList라는 이름으로 받고 타입은 List<Article>로 설정
- findAll()메서드가 반환하는 타입은 Iterable인데 작성한 타입은 List 라서 불일치라는 메시지가 뜸
- 해결하는 방법은 3가지가 있음
- 캐스팅하기 : 데이터 타입을 변환하는것을 의미 형변환이라고도함
- List<Article> articleEntityList = (List<Article>)articleRepository.findAll(); (다운캐스팅)
- Iterable<Article> articleEntityList = articleRepository.findAll(); (업캐스팅)
- findAll()메서드 Iterable이 아닌 ArrayList 를 반환하도록 하기
- repository 패키지안에있는 ArticleRepository 파일 열고 CrudRepository 메서드를 오버라이딩 하기
- @Override
ArrayList<Article> findAll(); 로 수
- 캐스팅하기 : 데이터 타입을 변환하는것을 의미 형변환이라고도함
- articleRepository입력하고 점(.)을 찍어 findAll()메서드 선택
- 가져온 Article 묶음을 모델에 등록
-
- index() 메서드의 매개변수로 model 객체를 받아옴
- model.addAttribute() 메서드로 전달할 데이터 묶음인 articleEntityList를 "articleList" 로 등
-
- 사용자에게 보여줄 뷰 페이지 설정
- 템플렛 아래에 있는 articles라는 디렉터리 안에 index.mustache파일 생성
- header, footer레이아웃 넣기
- show.mustache파일 안에있는 테이블 복사해서 header ,footer 사이에 넣기
- {{#article}} 이 부분을 articleList로 변경 {{/article}}이 부분도 마찬가지로 articleList 변경
- {{#articleList}} ,{{/articleList}} 이렇게 머스테치 문법에 쑨 변수가 데이터 묶음인 경우 내부 코드가 반복
- DB에서 모든 Article 데이터 가져오기
'BE > 스프링 부트 3' 카테고리의 다른 글
7장 게시판 수정하기 :Update (0) | 2023.11.29 |
---|---|
6장 게시판 내 페이지 이동하기 (0) | 2023.11.24 |
롬복과 리팩터링 (0) | 2023.11.21 |
DTO를 데이터 베이스에 저장하기 (1) | 2023.11.20 |
게시판 만들고 새 글 작성하기:Create (2) | 2023.11.19 |