[Spring] 게시물 읽기 (Read)*
데이터 조회 과정
1. 사용자가 데이터를 조회해달라고 웹 페이지에서 URL 요청을 보낸다 : @GetMapping, @PathVariable 사용
@GetMapping("/articles/{id}")
public String show(@PathVariable Long id, Model model)
2. 서버의 컨트롤러가 요청을 받아 해당 URL에서 찾으려는 데이터 정보를 리파지터리에 전달한다.
3. 리파지터리는 정보를 가지고 DB에 데이터 조회 요청
4. DB는 해당 데이터를 찾아 이를 엔티티로 반환
5. 반환된 엔티티는 모델을 통해 뷰 템플릿으로 전달됨.
model.addAttribute("article", articleEntitiy);
{{#article}}
<tr>
<th>{{id}}</th>
<td>{{title}}</td>
<td>{{content}}</td>
</tr>
{{/article}}
6. 최종적으로 결과 뷰 페이지가 완성되어 사용자의 화면에 출력됨.
단일 데이터 조회하기
컨트롤러에서 URL 변수를 사용할 때는 중괄호 하나만 쓰므로, {id} 로 적용하면 id는 변수로 사용된다.
@PathVariable : URL 요청으로 들어온 전달값을 컨트롤러의 매개변수로 가져오는 어노테이션
데이터 조회해 출력하기
순서는 아래와 같다.
1. id를 조회해 DB에서 해당 데이터 가져오기
2. 가져온 데이터를 모델에 등록하기
3. 조회한 데이터를 사용자에게 보여주기 위한 뷰 페이지 만들고 반환하기
하나씩 알아보자.
1. id를 조회해 DB에서 해당 데이터 가져오기
DB에서 데이터를 가져오는 주체는 리파지터리
findById()로 반환하는 타입은 optional<T>. 어떤 타입?
Article articleEntitiy = articleRepository.findById(id).orElse(null);
데이터를 조회한 결과, 값이 있으면 articleEntity 변수에 값을 넣고 없으면 null 저장
2. 모델에 데이터 등록하기
MVC 패턴에 따라 조회한 데이터를 뷰 페이지에서 사용하기 위해서
머스테치 문법 {{}} 찾아보기
id로 받아온 데이터를 articleEntity로 받았으니 모델변수명은 article, 그 값을 articleEntity로.
// model.addAttribute(String name, Object value);
model.addAttribute("article", articleEntitiy);
@NoArgsConstructor
하나를 더 추가해보고 id가 2일떄의 링크로 들어가보니
++ 클래스를 만들 때, 매개변수 없는 기본생성자도 만들기
@NoArgsConstructor
@AllArgsConstructor
둘 다 만들기
데이터 목록 조회하기
: 단일 데이터가 아닌 여러 데이터(데이터 목록)
단일 데이터 조회 | 데이터 목록(여러 데이터) |
리파지터리가 엔티티 반환 | 리파지터리가 리스트(엔티티 묶음) 반환 |
단일데이터와 같은 순서로
1. URL 요청받기
2. 데이터 조회해 출력하기
- DB에서 모든 Article 데이터 가져오기
findAll()의 반환형은 Iterable로 해결방법은 3가지가 있다.
1) 타입 캐스팅
2) articleEntityList의 타입을 findAll() 메서드가 반환하는 타입으로 맞추는 방법
3) ArrayList 이용하기
findAll() 메서드가 Iterable이 아닌 ArrayList로 반환하도록 수정하는 것.
ArticleRepository.java에서 수정 ( findAll 메서드 override 해주기 )
- 가져온 Article 묶음을 모델에 등록하기
@GetMapping("/articles")
public String index(Model model){
// 1. 모든 데이터 가져오기
ArrayList<Article> articleEntityList = articleRepository.findAll();
// 2. 모델에 데이터 등록하기
model.addAttribute("articleList", articleEntityList);
}
- 사용자에게 보여줄 뷰 페이지 설정하기 (return "/articles");
// index.mustache 핵심부분
{{#articleList}}
<tr>
<th>{{id}}</th>
<td>{{title}}</td>
<td>{{content}}</td>
</tr>
{{/articleList}}
이렇게 머스테치 문법에 쓴 변수가 데이터 묶음인 경우, 데이터 수 만큼 해당 부분을 반복한다는 점 기억하기
articles/new에 데이터를 입력후 submit을 눌러보고 /articles로 이동을 해보니 잘 출력됨을 확인했다.
참고로 CrudRepository 메서드 종류