본문 바로가기

강의/실전! 스프링 부트와 JPA 활용1

회원 목록 조회

이때까지 사용자가 입력한 회원 정보를 데이터 베이스에 저장해보았다.

이번에는 저장한 정보를 데이터 베이스로 부터 받아서 view에서 표시해보자.

 


1. 컨트롤러

 

@Controller
@RequiredArgsConstructor
public class MemberController {
    private final MemberService memberService;

    @GetMapping("members")
    public String showMemberList(Model model){
        // 저장되어 있는 회원들의 정보를 데이터베이스로 부터 가져와야 함
        // 모델에 회원 객체를 저장
        // 뷰 리턴
        return "members/showMemberList";
    }
}

@GetMapping 에서 필요한 로직은 데이터베이스로 부터 정보를 들고와야 하고, 들고 온 정보를 view에다가 뿌려주는 기능이 필요하다.

 

데이터베이스로 부터 회원 정보를 받는 기능은 Database -> MemberRepository -> MemberService -> MemberController @GetMapping 순서로 진행될 것이다. 

 

들고 온 회원 정보는 model.addAttribute를 이용하여 view에 넘겨줄 예정이다.

아래에서 완성된 MemberController를 확인해 보자

 

@Controller
@RequiredArgsConstructor
public class MemberController {
    private final MemberService memberService;

    @GetMapping("members")
    public String list(Model model) {
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members);
        return "members/memberList";
    }
}

 


2. 서비스

@Service
@Transactional(readOnly = true)
public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    // 회원 전체 조회
    public List<Member> findMembers(){
        return memberRepository.findAll();
    }

}

로직은 존재하지 않는다, 컨트롤러와 리포지토리를 연결해주는 역할만 하고 있다.

 


3. 리포지토리

@Repository
public class MemberRepository {
    @PersistenceContext
    private EntityManager em;

    public MemberRepository(EntityManager em) {
        this.em = em;
    }

    public List<Member> findAll(){
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }
}

직접 query문을 작성하여 database로 부터 정보를 받아오고 있다.

query문을 작성하는 방법은 JPQL 사용방법을 검색하면 확인할 수 있다.

  • getResultList() : 결과를 리스트로 반환하고 없다면 빈 리스트를 반환 -> null 걱정이 없음
  • getSingleResult() : 결과가 정확히 하나일 때만 사용
    • 둘 이상이면 NonUniqueResultException
    • 결과가 없으면 NoResultException
      • 결과가 없는데 exception이 터지면 try catch 써야하는게 너무 불편해서 spring data jpa에서는 NoResultException이 터지만 그냥 null이나 optional로 반환함

'강의 > 실전! 스프링 부트와 JPA 활용1' 카테고리의 다른 글

회원 등록  (0) 2021.07.07
h2 database 초기 실행  (0) 2021.06.21
프로젝트 생성  (0) 2021.06.21