Spring 프로젝트 시작하기 - DB 연결(JPA)

프로젝트에 JPA로 Mysql DB를 연결해볼것이다.

 

1. build.gradle 파일에서 의존성을 추가한다.

dependencies {
	...
	// JPA
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    
	// mysql
	implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.33'
	...
}

의존성을 추가한 후에는 잊지않고 Gradle을 새로고침해주도록 하자.

 

2. yml 파일에서 DB 연결정보를 입력한다.

spring:
  application:
    name: stock
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver << JDBC Driver를 쓴다
    url: jdbc:mysql://localhost:3306/stock << 연결할 DB를 입력한다.
    username: root << Mysql ID
    password: onlyroot << Mysql PW

 

3. DB 테이블과 싱크로율이 맞도록 Entity를 생성한다.

필드명과 타입에 주의한다.

@Entity // 이거 엔티티임
@Data // Getter & Setter를 자동으로 달아준다.
@Table(name = "u_user") // DB에서 사용하는 테이블 이름
public class MemberEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "u_idx") // DB에 명시되어있는 필드 이름
    Long userIdx; // 프로젝트 내에서 사용할 이름

    @Column(name = "c_idx")
    Long customerIdx;

    @Column(name = "u_active_yn")
    String userActiveYn;

    @Column(name = "u_memo")
    String userMemo;

    @Column(name = "insert_dt")
    Long insertDt;

    @Column(name = "insert_id")
    String insertId;

    @Column(name = "update_dt")
    Long updateDt;

    @Column(name = "update_id")
    String updateId;

    @Column(name = "delete_yn")
    String deleteYn;
}

 

❗ 주의할점
DB 필드명이 u_idx인데 Entity에는 userIdx로 명시한것이 보일것이다.
JPA는 _로 나눠지는 첫글자가 한글자일때, Repository 내에서 정상동작이 불가능한 현상이 있다.
한글자로 시작하는경우, 한글자 이상이 되도록 적절하게 네이밍해주자.

Could not resolve attribute 'CIdx' of 'org.debugggggger.stock.java.io.core.api.mysql.entity.MemberEntity'

 

4. Repository를 생성한다. (여기서는 리스트 조회)

@Repository
public interface MemberRepository extends JpaRepository<MemberEntity,Long> {
    List<MemberEntity> findMemberEntitiesByCustomerIdx(Long cIdx);
}

JPA에서는 메소드 이름을 적절하게 지어주면 자동으로 쿼리를 만들어준다. (메소드 명명 규칙)

find : 조건에 맞는 리스트를 가져옴

MemberEntities : 가져올 데이터의 테이블 정보 맵핑(위에서 정의한 Entity)

ByCustomerIdx : 파라미터로 받은 cIdx 데이터를 기준으로 CustomerIdx(c_idx) 검색

 

@Repository
public interface MemberRepository extends JpaRepository<MemberEntity,Long> {
    @Query("SELECT mem FROM MemberEntity mem WHERE mem.customerIdx = :cIdx AND mem.userActiveYn = 'Y'")
    List<MemberEntity> findActiveMemberList(Long cIdx);
}

검색해야되는 조건이 복잡하고 이름이 길어지는게 싫다면 @Query로 직접 쿼리문을 작성할 수도 있다.

Entity에 작성된 필드명으로 작성해야하며, 실제 필드명으로 쓰는 실수를 하지 않도록 주의하자. 

 

5. Controller / Service 단을 작성한다.

▼ 데이터를 불러올 MemberService

@Slf4j // 이것도 로그용도
@Service // 서비스에 달아준다.
@RequiredArgsConstructor // 생성자 주입용
public class MemberService {

    private final MemberRepository memberRepository;

    public Map<String, Object> selectMemberList(JwtTokenDto user) {
        Map<String, Object> body = new HashMap<>();
        log.debug("selectMemberList user :" + user.toString());

        List<MemberEntity> memberEntity = memberRepository.getMemberEntitiesByCustomerIdx(user.getCIdx()); // 위에서 만든 JPA 메소드
        body.put("list", memberEntity);
        return body;
    }
}

 


▼유저정보를 조회하는 MemberController

@Slf4j // 로그용도
@RequestMapping("/account/member")
@RestController // 컨트롤러에 달아줌
@RequiredArgsConstructor // 생성자 주입용
public class MemberController {

    private final MemberService memberService;


    /**
     * 멤버 리스트 조회
     *
     * @return 멤버 리스트
     * GET /account/member/list
     */
    @GetMapping("/list")
    public ResponseEntity<Map<String, Object>> selectMemberList(HttpServletRequest request, @RequestParam Map<String, Object> param) {
        JwtTokenDto user = new JwtTokenDto(request);
        log.info("selectMemberList 진입"); // Slf4j가 있으면 log를 쓸수 있다.
        param.put("cIdx", 1);
        return ResponseEntity.ok(Map.of(
                "code", 200,
                "message", "OK",
                "body", memberService.selectMemberList(user)
        ));
    }
}

 

6. 데이터를 확인한다.