서버 개발/JPA

JPA - (2) 객체 매핑

Johnny Yoon 2019. 8. 6. 21:28
728x90
반응형

 

 

 

객체 생성

지난번 포스팅에 이어 셋팅된 프로젝트에 객체를 추가하겠습니다.

h2 web console에서 다음과 같은 테이블을 생성했습니다.

CREATE TABLE MEMBER (
    ID VARCHAR(255) NOT NULL,
    NAME VARCHAR(255),
    AGE INTEGER,
    PRIMARY KEY (ID)
);

위의 테이블을 자바의 객체로 만들어 주도록 하겠습니다.

 

Member.java

프로젝트 디렉토리 (src/java/com.jyoon.study.hello-jpa)밑에 jpa라는 디렉토리를 상성하고,

Member.java클래스를 생성해줍니다.

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="MEMBER")
public class Member {
    @Id
    @Getter @Setter
    private String id;
    @Getter @Setter
    private String username;
    @Getter @Setter
    private Integer age;

    @Override
    public String toString() {
        return "Member[id="+id+", username="+username+", age="+age+"]";
    }
}

위 클래스를 보면, @Entity와 @Table이라는 Annotation을 클래스에 달아주었습니다.

@Entity는 관계DB와 자바 객체를 매핑하는 Annotation입니다.

따라서 앞서 생성해주었던 Member테이블이 Member객체로 매핑됩니다.

 

@Table은 DB의 테이블 이름을 지정해 주는 것입니다.

이 Annotation은 보통 객체의 이름과 테이블 이름이 다를 때 사용합니다.

 

String id멤버에 @Id를 사용했습니다.

이 Annotation은 테이블의 Primary Key를 지정해줍니다.

 

마지막으로 Lombok을 사용했습니다.

지난 포스팅에서 짧게 설명 했지만, Getter와 Setter메소드를 자동으로 생성해줍니다.

(Lombok을 사용하려면, File>Settings>Compiler>Annotation Processors에서 Enbale을 클릭해주어야 합니다.)

 

웹서비스 생성

스프링부트를 사용하기 때문에 기본적인 웹서비스를 생성해주겠습니다.

스프링 부트에서는 JPA를 사용할 때, Repository - Service - Controller 순으로 데이터를 웹서비스에 전달해 줍니다.

(스프링 부트 포스팅이 아니기 때문에 자세한 설명은 생략하겠습니다.)

 

Repository

먼저 repository디렉토리를 만들고 다음과 같이 MemberRepository.java파일을 만들어 주겠습니다.

import com.jyoon.study.hellojpa.jpa.Member;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface MemberRepository extends CrudRepository<Member, Integer> {
    List<Member> findAllByOrderByIdDesc();
}

CrudRepository는 기본적인 CRUD, 즉 Create, Read, Update, Delete를 제공합니다.

또한, 메소드 이름으로 간단하게 SQL을 컨트롤 할 수 있습니다.

위의 메소드의 의미는 다음과 같습니다.

  • findAllBy - 해당 테이블의 모든 레코드를 리턴
  • OrderById - Order By메소드를 사용해 id로 Sort
  • Desc - Sort는 Descending 방식으로

 

Service

이제 Service를 생성해줍니다.

먼저 다음과 같이 MemberService.java 인터페이스를 만들고,

import com.jyoon.study.hellojpa.jpa.Member;

import java.util.List;

public interface MemberService {
    List<Member> selectMemberList() throws Exception;
    void saveMember(Member member) throws Exception;
}

 

MemberServiceImpl.java에서 구현해주도록 합니다.

import com.jyoon.study.hellojpa.jpa.Member;
import com.jyoon.study.hellojpa.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MemberServiceImpl implements MemberService {

    @Autowired
    MemberRepository memberRepository;

    @Override
    public List<Member> selectMemberList() throws Exception {
        return memberRepository.findAllByOrderByIdDesc();
    }

    @Override
    public void saveMember(Member member) throws Exception {}
}

이 때, Service는 스프링의 @Autowired Annotation을 통해 MemberRepository를 주입받습니다.

selectMemberList메소드는 memberRepository의 findAllByOrderByIdDesc메소드를 통해 데이터를 가져옵니다.

 

Controller

마지막으로 실제 서비스를 하게되는 Controller를 작성하겠습니다.

import com.jyoon.study.hellojpa.jpa.Member;
import com.jyoon.study.hellojpa.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class MemberController {
    @Autowired
    private MemberService memberService;

    @GetMapping(name="/member/list", produces="application/json")
    @ResponseBody
    public String getMemberList() throws Exception {
        List<Member> list = memberService.selectMemberList();
        return list.toString();
    }
}

실제로 화면을 서빙 할 것은 아니기 때문에 json으로 response하는 방식을 택했습니다.

MemberController역시 MemberService를 @Autowired를 통해 주입받습니다.

 

이 때 서비스되는 uri는 /member/list가 되고, 이 uri를 request하면, 결과값을 리스트 형태의 json으로 response하게 됩니다.

 

결과 확인

이제 작성한 결과를 확인해 보겠습니다. HelloJpaApplication을 재실행합니다.

H2는 메모리 DB이기 때문에, 애플리케이션을 재실행하면 저장해두었던 레코드는 모두 사라지게 됩니다.

이전 포스팅을 참조해 레코드를 다시 넣어 주시기 바랍니다.

 

웹브라우저에서 다음 url로 접속해 결과를 확인합니다.

http://localhost:8080/member/list

 

결과가 다음과 같이 나온다면 성공한 것입니다.

전체소스

이 포스팅의 전체 소스코드는 아래 깃허브 리포의 2nd 브랜치에서 확인하실 수 있습니다.

https://github.com/ydy1128/hello-jpa

 

728x90
반응형

'서버 개발 > JPA' 카테고리의 다른 글

JPA - (1) 프로젝트 생성  (0) 2019.08.05