단일 조회는 url을 "members/1" 이런식으로 하나의 회원가입을 조회하는 식으로 할거다.
01. 단일조회
controller 의 흐름은 1. 데이터를 조회한다. 2. 모델에 데이터를 등록한다. 3. 페이지에 반환한다. 이 순서이다.
데이터 조회> 모델 데이터 등록> 페이지 반환 순으로 어떻게 작성해야할지 생각해보자.
1. 데이터 조회하기 위해서는 Repository에 있는 데이터를 가져와야 한다.
- Repository에 있는 데이터를 가져올 때는 findById를 사용한다. (단일 아이디 조회이기 때문에 findAll이아니다.)
- findById는 다음과 같은 시그니처를 가지고 있다.
Optional<T> findById(Id id);
- Optional이라는 건 특정 ID 에 해당하는 Entity가 있을 수도, 없을 수도 있기 때문에 JPA는 Optional로 감싸서 반환한다.
- 데이터를 조회할 때, 값이 없을 가능성을 안전하게 처리하기 위함이다.
- 자바의 버전이 8버전 이상이면
Optional<Member> memberEntity = memberRepository.findById(id);
위와 같이도 가능하다.
그렇지만, 모든 버전이 가능한
Member meberEntity = memberRepository.findById(id).orElse(null);
위의 코드를 사용할 것이다.
- 위의 컨트롤러를 작동하기 이전에 필요한 파일은 1. 뷰페이지(단일 조회해줄 페이지), 2. Entity, 3. Repository, 4. DTO 가 필요하다.
① 뷰페이지는 머스터치로 간단하게 제작했다.
{{>layouts/header}}
<table class="table">
<thead class="table-light">
<tr>
<th scope="col">Id</th>
<th scope="col">email</th>
<th scope="col">password</th>
</tr>
</thead>
<tbody>
{{#member}}
<tr>
<th>{{id}}</th>
<td>{{email}}</td>
<td>{{password}}</td>
</tr>
{{/member}}
</tbody>
</table>
{{>layouts/footer}}
② Entity도 수정을 할것이다. Id 의 값을 GeneratedValue를 줄것이다.
- Entity 에서 중요한 부분이 있다. 바로 AllArgsConstructor(생성자)과 NoArgsConstructor(기본생성자)이다.
- 원래 기본 생성자와, 생성자를 따로 작성해야하나 lombok 을 어노테이션 하면 따로 코드를 작성하지 않아도 된다.
package com.example.firstproject.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.ToString;
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column
private String email;
@Column
private String password;
}
③ DTO를 수정할 것인데, id 값을 null 값으로 반환해야한다.
package com.example.firstproject.dto;
import com.example.firstproject.entity.Member;
import lombok.AllArgsConstructor;
import lombok.ToString;
@AllArgsConstructor
@ToString
public class MemberForm {
// 이메일, 패스워드 받을 필드
private String email;
private String password;
public Member toEntity() {
return new Member(null,email,password);
}
}
④ Repository
public interface MemberRepository extends CrudRepository<Member, Long> {
}
- 반환 값이 Long 이어야 한다. (id 가 Long 이기 때문)
⑤ Controller 작성하기
// 1. ID를 조회해 데이터 가져오기.
Member memberEntity = memberRepository.findById(id).orElse(null);
2. 모델에 데이터를 등록하기 위해서는 addAttribute() 메서드를 통해 Entity 객체를 추가해야한다.
// 2. 모델에 데이터를 등록
model.addAttribute("member",memberEntity);
3. 페이지 반환을 위해서는 뷰 페이지를 반환해야한다.
@GetMapping("/members/{id}")
public String showMember(@PathVariable Long id, Model model){
// 1. ID를 조회해 데이터 가져오기.
Member memberEntity = memberRepository.findById(id).orElse(null);
// 2. 모델에 데이터를 등록
model.addAttribute("member",memberEntity);
// 3. 뷰를 반환
return "members/show";
}
4. 출력 확인
회원가입시, 아래의 테이블에 입력된다.
02. 여러 데이터 조회
- 앞과 같은 패턴으로 이해하면 된다.
1. ID를 findAll로 조회한다.
2. 모델에 entity 등록한다.
3. 뷰페이지 반환한다.
이러한 흐름으로 가면 된다.
1. member 테이블을 보여줄 Mustache 파일을 만들어준다.
{{>layouts/header}}
<table class="table">
<thead>
<tr>
<th scope="col">Id</th>
<th scope="col">Email</th>
<th scope="col">Password</th>
</tr>
</thead>
<tbody>
{{#memberList}}
<tr>
<th>{{id}}</th>
<td>{{email}}</td>
<td>{{password}}</td>
</tr>
{{/memberList}}
</tbody>
</table>
{{>layouts/footer}}
- 이때 주의해야할 부분은 memberList 가 아래의 모델 등록할 시 attributeName과 일치해야 한다는 것이다.
2. ID를 findAll로 조회한다.
- findaAll의 경우 인터러블 타입으로 반환된다. 하지만 보통 ArrayList로 받고자 한다. 둘의 타입이 다르기 때문에 형변환이 필요하다.
- 형 변환을 하기 위해서는 repostiory에 오버라이드를 할 것인데, Repository 폴더를 아래와 같이 수정해주겠다.
public interface MemberRepository extends CrudRepository<Member, Long> {
@Override
ArrayList<Member> findAll();
}
- 그런 후 controller 에 아래와 같이 작성하면 된다.
ArrayList<Member> memberEntityList = memberRepository.findAll();
3. 모델에 데이터를 등록해두어야한다.
model.addAttribute("memberList",memberEntityList);
4. 뷰 반환
@GetMapping("/members")
public String index(Model model){
// 1. 여러 데이터 조회하기
ArrayList<Member> memberEntityList = memberRepository.findAll();
// 2. 모델에 저장해두기
model.addAttribute("memberList",memberEntityList);
// 3. 뷰페이지 반환하기
return "members/index";
}
5. 결과 확인
2025-01-11T21:51:15.679+09:00 INFO 18732 --- [nio-8080-exec-1] c.e.f.controller.MemberController : MemberForm(email=aaa@cc.com, password=111)
2025-01-11T21:51:15.679+09:00 INFO 18732 --- [nio-8080-exec-1] c.e.f.controller.MemberController : Member(id=null, email=aaa@cc.com, password=111)
2025-01-11T21:51:15.722+09:00 INFO 18732 --- [nio-8080-exec-1] c.e.f.controller.MemberController : Member(id=1, email=aaa@cc.com, password=111)
2025-01-11T21:51:19.259+09:00 INFO 18732 --- [nio-8080-exec-2] c.e.f.controller.MemberController : MemberForm(email=bbb@cc.com, password=222)
2025-01-11T21:51:19.259+09:00 INFO 18732 --- [nio-8080-exec-2] c.e.f.controller.MemberController : Member(id=null, email=bbb@cc.com, password=222)
2025-01-11T21:51:19.260+09:00 INFO 18732 --- [nio-8080-exec-2] c.e.f.controller.MemberController : Member(id=2, email=bbb@cc.com, password=222)
2025-01-11T21:51:22.353+09:00 INFO 18732 --- [nio-8080-exec-5] c.e.f.controller.MemberController : MemberForm(email=ccc@cc.com, password=333)
2025-01-11T21:51:22.354+09:00 INFO 18732 --- [nio-8080-exec-5] c.e.f.controller.MemberController : Member(id=null, email=ccc@cc.com, password=333)
2025-01-11T21:51:22.355+09:00 INFO 18732 --- [nio-8080-exec-5] c.e.f.controller.MemberController : Member(id=3, email=ccc@cc.com, password=333)
성공적으로 출력되는 걸 볼수있다! 끝 : >
'코딩 공부 > Spirngboot' 카테고리의 다른 글
[회원가입 실습] 회원 수정 (0) | 2025.01.14 |
---|---|
[Redirect 실습] (0) | 2025.01.12 |
[Data조회과정과 생성과정] (0) | 2025.01.11 |
[JPA] 개념 (0) | 2025.01.10 |
[DTO 실습] (0) | 2025.01.10 |