게시글 읽기 : Read
데이터 조회 과정
- 웹 페이지에 게시글을 등록 -> 서버를 통해 DB에 저장
DB에 저장된 데이터를 웹 페이지에 출력해야 한다.
사용자가 데이터 조회해달라고 url로 요청한다. <form>
서버의 컨트롤러가 요청을 받고 찾으려는 데이터 정보를 리파지토리에 전달
리파지터리는 정보를 가지고 DB에 데이터 조회 요청
DB가 찾아서 엔티티로 반환
엔티티는 모델에서 뷰 템플릿으로 전달
뷰 페이지 클라이언트 화면에 출력
--- 단일 데이터 조회하기
url에서 요청을 받아야 한다
url 이 직접 id 정보를 서버에 보내서 id= 1인 데이터를 달라고 요청할 수 있음
articles/id 로 URL 요청할 때 응답할 수 있도록 구현하기
@GetMapping("/articles/{id}") 로 id를 변수로 사용한다.
URL요청을 받아서 수행할 show() 메서드 만들기
메서드의 매개변수는 URL에 있는 id를 가져와야 하는데, @PathVariable 어노테이션을 붙인다.
@PathVariable은 URL에 있는 전달값을 컨트롤러의 매개변수로 가져오는 어노테이션이다.
이제 show(id) 는
1. id 를 조회해서 DB에 id번째 데이터를 가져와야 한다.
2. 가져온 데이터를 모델에 등록하고
3. 조회한 데이터를 사용자에게 보여주기 위한 뷰 페이지를 만들고 반환해줘야 한다.
-1-
리파지토리는 스프링부트가 자동으로 @Autowired 로 객체를 만들어 놨었다.
이 리파지토리에 id를 가지고 find를 한다. - findById(Long id) : JPA의 CrudRepository가 제공하는 메서드
특정 엔티티의 id값을 기준으로 데이터를 찾아서 Optional 타입으로 반환
Article articleEntity 에 Optional 타입으로 가져온다
Optinal<Article> 로 받거나 끝에 orElse(null) 추가해서 해결
-2-
모델에 데이터를 등록
articleEntity에 담긴 데이터를 모델에 등록해야 한다. 모델에 등록해놔야 그 모델을 뷰 페이지에서 사용할 수 있기 때ㅜㅁㄴ
model.addAttributte(String name, Object Value)
name : 모델에 등록할 객체의 이름
Value : 객체
-3-
뷰페이지 show.mustache 제작
부트스트랩 사용
아까 article이라는 이름으로 articleEntity 등록했음
모델에 등록한 article은 뷰 페이지에서 mustache 문법 이용해서 출력한다.
이때 {{#article}}{{/article}} 로 가져와서 사용한다.
이렇게 만들어놔도 데이터 입력 하고 바로 볼 수 가 없다.
No default Constructor for entity : Article 엔티티에 기본 생성자 가 없다
? 아까 AllArgsConstructor은 뭐지
- 기본 생성자는 생성자인데 매개변수가 아무것도 없는 생성자임
롬복으로 @NoArgsConstructor 이용해서 기본 생성자를 자동으로 추가할 수 있다.
--- 데이터 목록 조회하기
이제 단일 데이터가 아닌 여러개의 데이터, 데이터 목록을 조회할 수 있다.
방금까지 단일 데이터를 조회할 때랑 다르게, 엔티티 여러개를 리스트로 반환해야 한다.
public String index() 메서드를 구현하자
1. 일단 DB에서 모든 article들을 가져와서
2. article 묶음을 모델로 묶고
3. 그 모델을 이용해서 뷰 페이지를 만들어야 한다.
1. DB에서 데이터를 가져오려면 리파지토리가 필요하다. articleRepository 에서 findAll() 메서드를 이용, 모든 DB 데이터를 가져온다.
List<Article> articleEntityList = articleRepository.findAll();
findAll()은 iterable 데이터 타입을 반환하지만 작성 타입이 List라 에러 발생한다.
다운 캐스팅을 하거나 업 캐스팅으로 문제를 해결할 수 있다.
또는 findAll()이 ArrayList 타입을 반환하도록 오버라이드 하면 된다.
2. 모델에 데이터 등록하기
뷰 페이지로 변환할 수 있는 모델에 이제 addAttribute를 이용해서 DB에서 가져온 데이터를 넣어준다.
"articleList" 라는 이름으로 모델에 방금 가져온 articleEntityList를 넣어준다.
3. 뷰페이지를 index.mustache로 구현한다.
이때 내용 부분이 모델 속 리스트를 순회하면서 모두 출력할 수 있어야 한다.
mustache 속 {{#articlesList}} ~ {{/articleList}} 안에 반복되는 리스트를 넣는다.