반응형

기존에 Sawon Data를 JPA를 활용해서 한 번 만들어보자!

 

desc sawon으로 column 확인!

 

 

 

[ Entity = Vo 작성하기 ]

 

JPA에서는 자체적으로 Entity에 제약조건을 걸어주어야 오류가 발생하지 않는다.

@Entity
@Data
@Table(name="sawon") // Entity명과 Table명이 동일하면 생략이 가능하다.
public class Sawon {
    
    @Id
    int sabun;  // primary key

    String saname;
    String sasex;
    
    int deptno;

    String sajob;
    String sahire;

    @Column(nullable = true) // null 허용
    Integer samgr;

    int sapay;

}

 

 

[ Repository = Dao 생성하기 ]

 

Interface를 상속받는 구현객체가 없어도 Implements를 알아서 Spring Boot가 전부 생성한다.

//                                             연결한 Table , PrimaryKey Type
public interface SawonRepository extends JpaRepository<Sawon,Integer> {

    // 이 안에는 findAll(), findBySabun(), 등등 모든 기능이 구현이 되어있다. (자동으로)
    
}

 

 

 

[ @RestController 생성하기 ]

 

@RestController // @Controller + @ResponseBody
public class SawonController {

    @Autowired
    SawonRepository sawonRepository;
    
    @GetMapping("/sawons")
    public List<Sawon> selectList() {

        return sawonRepository.findAll();
    }
}

 

 

 

[ Repository에 SQL문을 적용 ]

 

기존에 만들어져있는 findAllByDeptno를 내가 사용하고 싶은 SQL문으로 재정의

//                                             연결한 Table , PrimaryKey Type
public interface SawonRepository extends JpaRepository<Sawon,Integer> {

    // 이 안에는 findAll(), findBySabun(), 등등 모든 기능이 구현이 되어있다. (자동으로)
    
    // 일반 SQL문 사용                               :변수처리 or :1 (첫 번째 변수)
    @Query(value="select * from sawon where deptno = :deptno", nativeQuery = true)
    List<Sawon> findAllByDeptno(int deptno);    // 부서별 조회
}

 

 

 

Controller에 selectListFromDeptno Method 추가하기

@RestController // @Controller + @ResponseBody
public class SawonController {

    @Autowired
    SawonRepository sawonRepository;
    
    // 전체 조회
    @GetMapping("/sawons")
    public List<Sawon> selectList() {

        return sawonRepository.findAll();
    }

    // 부서별 조회
    @GetMapping("/sawons/{deptno}")
    public List<Sawon> selectListFromDeptno(@PathVariable int deptno) {

        return sawonRepository.findAllByDeptno(deptno);
    }
}

 

 

 

 

 

 

[ JPQL ]

 

#### JPQL(Java Persistence Query Language)
JPQL 은 객체지향 쿼리언어. 따라서 테이블을 대상으로 쿼리하는것이 아니라 엔티티 객체를 대상으로 쿼리한다.
JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하지 않는다
JPQL은 결국 SQL로 변환된다.

 

####  JPQL 문법

엔티티와 속성은 대소문자 구분O (Member, age)
JPQL키워드는 대소문자 구분X (SELECT , FROM, where)
엔티티 이름을 사용함, 테이블 이름이 아님(Member)
반드시 alias명 사용 : 별칭은 필수 (m) (as는 생략가능)

 

 

JPA는 편안하긴 한데, mapper를 사용해서 Mybatis 사용하는게 결론적으로는 더 편안하다.

(Join 기능, view 활용 등등 이런 복잡한 SQL문이 생겨날 시에, 구조가 복잡해지고 가독성이 떨어진다)

 

 

[ sort 정렬 처리 ]

 

RestController에 이렇게 입력만 해줘도 끝

assending(오름차순)

    // sort 처리
    @GetMapping("/sawons-sortbysapay")
    public List<Sawon> selectListSortBySapayDesc() {

        return sawonRepository.findAll(Sort.by("sapay"));
    }

descending(내림차순)

 

 

 

[ Paging 처리 페이징처리 ]

 

@RestController에 추가

    // Page 처리 : @ralce11 later 이던지 MySQL 설치해서 나중에 확인해보자..
    @GetMapping("/sawons/{page}/{count}")
    public List<Sawon> slectListByPaging(@PathVariable int page, @PathVariable int count) {

        Pageable pageAble = PageRequest.of(page, count, Sort.by("sabun"));

        Page<Sawon> pageSawon =  sawonRepository.findAll(pageAble);
        // Page<Sawon> -> List<Sawon> 변환 : getContent()
        //return sawonRepository.findAll(pageAble).getContent();
        return pageSawon.getContent();
    }

 

 

 

[ primary key로 참조하기 ]

 

@Repository 설정하기

    // Sawon과 Dept를 Inner Join 하였음. (MySQL에서는 error 미발생)
    @Query(value="select * from Sawon s inner join Dept d using(deptno) = d.deptno", nativeQuery=true)
    List<Sawon> findAllWithDept();

 

 

@Entity 설정하기

    // update no, insert no, 오로지 참조만 하게 설정
    @Column(insertable = false, updatable = false)
    int deptno;

    @OneToOne   // 두 개를 Join 할 때, 1:1로 연결한다.
    @JoinColumn(name = "deptno", referencedColumnName = "deptno") // Join
    Dept dept;

 

 

@RestController 추가하기

    // 전체 조회 + query 추가
    @GetMapping("/sawons-query")
    public List<Sawon> selectListWithDept() {

        return sawonRepository.findAllWithDept();
    }

 

 

 

[ @OneToMany Join ]

    @OneToMany
    @JoinColumn(name="godam", referencedColumnName = "sabun")   // Join
    List<Gogek> golist;

 

 

@Entity 작성하기

@Entity
@Data   // Getter + Setter
public class Gogek {

    @Id
    int gobun;  // Primary Key

    String goname;
    String goaddr;
    String gojumin;

    int godam;

}

 

 

반응형

'SpringBoot↗' 카테고리의 다른 글

AWS 서버(프로젝트 업로드)  (0) 2024.08.13
Spring Boot)Transaction  (0) 2024.08.12
Spring Boot) JPA  (0) 2024.08.08
SpringBoot 환경설정 및 초기 가이드  (0) 2024.08.07
Spring)RMI  (0) 2024.08.07