코딩 공부/Spirngboot

[단일, 리스트 데이터 조회] 회원가입 조회

sintory-04 2025. 1. 11. 21:52

단일 조회는 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