1. JPA 환경 설정
(1) 프로젝트 생성할 때 Spring Data JPA 의존성 주입하기~

(2) application.properties 에 jpa 코드 추가하기
#jpa
spring.jpa.generate-ddl=true
spring.jpa.database=oracle
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
// 자동으로 테이블 생성해줌.
만약 vo 코드를 수정하면 테이블을 자동으로 수정해주지 않고~! 테이블을 새로 생성해줌.
계속 테이블이 생성되는 것이 번거롭다면 false로 해라~
spring.jpa.database=oracle
// db 종류
spring.jpa.show-sql=true
// sql 쿼리문이 실행되면 실행된 쿼리문이 콘솔창에 찍힘.
(3) Vo 를 신중히 만들기
- Vo 파일 이름을 만들고자 하는 spl 테이블 이름으로 지어야 함
!! 안전하게 하려면 !!
- 멤버변수를 모두 소문자
- Vo 이름은 첫글자만 대문자로
2. JPA
- JPA는 db 자동화 프레임워크다. orm.
- db에서 테이블 생성 => 똑같은 이름, 컬럼명과 똑같은 멤버변수를 가지는 vo 정의.
(1) Vo 와 Dto를 분리시켜 쓴다.
DB (sql) |
▶▶▶▶ ◁◁◁◁ |
Web View |
||
Entity (Vo) |
Dto | dao, service, controller | ||
DB 에 값을 담는 객체 | 데이터를 이동시키는 객체 | 기능 메서드 |
-- Vo (Value Object) : 값을 담는 객체
-- Dto (Data Transfer Object) : 데이터를 이동시키는 객체
- jpa 에서 vo는 자바에서 짠 sql table 이 되고, dto는 그동안 써온 Vo의 역할을 한다.
sql 테이블에 저장할 값과 서버 내에서 돌아갈 값이 다른 경우 용이하다.
(ex. multipart 같이 이미지 파일은 db에 안넣어도 됨)
dto를 거치지 않고 sql 멤버변수와 임시 멤버변수가 vo에 다 있을 경우 .. 꼭 필요하지 않은 값들이 뷰 까지 가게 되고,
거기서 원치않는 수정이 일어날 위험이 있다.
@Entity : 테이블 클래스 정의.
- 지정된 vo 클래스와 동일한 이름의 테이블이 자동으로 생성. (MyMember -> my_member)
- 이 클래스의 멤버변수와 동일한 이름과 타입의 컬럼 생성.
@Id - primary key 지정
@Table(name="테이블명") - vo 클래스 이름과 다르게 테이블을 생성하고 싶을 때 name 속성에 사용할 테이블 이름 작성
@Column(name="컬럼명", nullable=true/false) : 컬럼의 이름과 속성을 설정
@Transient -이 멤버변수는 컬럼에서 제외. ( @Entity 안에 @Transient 쓰거나(Dto 안쓸경우), vo에 쓰지 않고 Dto에 쓰면 됨)
@PrePersist - insert문 실행 전에 먼저 처리
▼ Entity (Vo)
package com.example.demo.board;
import java.util.Date;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import com.example.demo.member.Mymember;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.persistence.SequenceGenerator;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Entity
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Myboard {
@Id
@SequenceGenerator(name="seq_gen", sequenceName="seq_myboard", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_myboard")
private int num;
// @ManyToOne(n:1) -- 여러 글을 한 사람이 쓸 수 있음
// @OneToOne(1:1) -- 한 사람이 하나만 만들 수 있음
// @OneToMany(1:n) -- 한 사람이 여러 글을 쓸 수 있음
// @ManyToMany(n:n) -- 여러 사람이 여러 글을 쓸 수 있음 (..?)
@ManyToOne
@JoinColumn(nullable=false) // fk 설정
@OnDelete(action = OnDeleteAction.CASCADE) // on delete cascade
private Mymember writer; // 검색할 때마다 테이블을 조인해서 writer에 대한 정보를 모두 보여줌..
private Date wdate; // java.util.Date 로 import
private String title;
private String content;
@PreUpdate
@PrePersist //insert문 실행 전에 먼저 처리
public void sysdate() {
wdate = new Date();
}
}
▼ Dto
package com.example.demo.board;
import java.util.Date;
import com.example.demo.member.Mymember;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class MyBoardDto {
private int num;
private Mymember writer;
private Date wdate;
private String title;
private String content;
}
(+) 자동 할당
@GeneratedValue - 값을 자동으로 생성해서 할당
(db 종류에 따라 자동 할당하는 방법이 다름)
* mysql - @GeneratedValue(strategy = GenerationType.IDENTITY)
create table tbl1(
num int primary key auto_increment,
name varchar2(10) not null
);
* oracle - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="seq_myproduct")
@SequenceGenerator(name="seq_gen", sequenceName="seq_myproduct", allocationSize=1)
create table tbl2(
num number primary key,
name varchar2(20) not null
);
create sequence seq_tbl2;
insert into tbl2 values(seq_tbl2.nextval, 'aaa');
오라클은 시퀀스를 생성해줘야 함.
- sequenceName : 사용할 시퀀스 이름
- allocationSize : 캐쉬에 담을 값의 개수 ( 캐쉬 : 자주 사용하는 값을 담아놓는 메모리 )
---- allocationSize를 할당하지 않으면 기본값(50) 까지 메모리에 올려놓고 빠르게 꺼내올 수 있음.
그러나 db를 껐다가 켜면 할당된 값은 이미 소모되었기 때문에 1, 2, 52 이렇게 한번에 숫자가 뛸 수 있음.
그게 싫으면 allocationSize를 할당해주면 됨. (근데 안됨 왜 안될까 뭐때문에 안될까)
db를 끌 일이 별로 없으면 기본값으로 가는게 속도가 빨라서 좋음~
(2) Dao는 interface 클래스로, JpaRepository를 상속받는다.
- 인터페이스가 인터페이스를 상속받는 키워드도 extends 다.
JpaRepository<Entity 클래스명, pk 타입> 인터페이스를 상속받아 만든다.
- 이 인터페이스의 구현은 jpa 프레임워크가 자동으로 함.
@Repository
public interface ProductDao extends JpaRepository<MyProduct, Integer> {
// 컬럼명의 타입과 파라메터 타입이 같아야 함.
ArrayList<MyProduct> findByName(String name); // 제품명이 정확히 일치한 것만 찾을 수 있음.
ArrayList<MyProduct> findByNameLike(String name);
ArrayList<MyProduct> findByPriceBetween(int p1, int p2);
}
- 메서드 대신 직접 SQL 문을 작성할 수 있다.
@Transactional
@Modifying
@Query(value="update Downfile set cnt=cnt+1 where num=:num", nativeQuery=true)
void updateCnt(@Param("num") int num);
(3) Service에서는 정의된 db 처리 메서드로 기능을 구현한다.
- JpaRepository 는 db 처리 메서드가 정의되어 있음.
(* 여기서 Entity 란 기존의, 지금껏 연습해 온 Vo로, 직접적으로 Sql 과 맞닿아있다.)
(* Dto는 메서드와 Vo 사이의 필터 같은 느낌. 꼭 거쳐가야 함)
- save() : insert, update 실행 메서드.
---- Entity 타입의 객체를 파람으로 받고 방금 쓴 줄을 Entity 타입으로 변환.
파라메터 Entity 의 pk 값이 db에 없으면 insert 실행, 있으면 Update 를 실행.
update로 실행되면 모든 컬럼 수정됨. => 수정할 때 수정하지 않을 값도 다 넣어줘야 수정이 된다~
public void saveMember(MyMemberDto dto) {
dao.save(new Mymember(dto.getId(), dto.getPwd(), dto.getName(), dto.getEmail()));
}
- findAll() : 파라메터 없음. 전체 검색한 결과를 Entity 의 list로 변환.
public ArrayList<MyBoardDto> getAllBoard(){
ArrayList<Myboard> list = (ArrayList<Myboard>) dao.findAll();
ArrayList<MyBoardDto> dtoList = new ArrayList<MyBoardDto>();
for(Myboard entity:list) {
dtoList.add(new MyBoardDto(entity.getNum(), entity.getWriter(), entity.getWdate(), entity.getTitle(), entity.getContent()));
}
return dtoList;
}
- findById(pk) : pk 기준 검색/ 한 줄 검색되거나 검색 안됨. ==> 검색 안되면 예외 발생 => .orElse(null);
public MyMemberDto getMember(String id) {
Mymember entity = dao.findById(id).orElse(null);
if(entity == null) {
return null;
}
return new MyMemberDto(entity.getId(), entity.getPwd(), entity.getName(), entity.getEmail());
}
- deleteById(pk) - pk 기준 한줄 삭제
public void delBoard(int num) {
dao.deleteById(num);
}
- findBy컬러명(컬럼타입 값) : 컬럼 기준 검색.
---- 한 줄 검색이면 Entity를, 여러줄 검색이면 ArrayList<Entity> 를 반환타입으로 저장.
ArrayList<Myboard> findByWriter(Mymember writer);
public ArrayList<MyBoardDto> getBoardByWriter(String writer){
Mymember vo = new Mymember(writer, "", "", "");
ArrayList<Myboard> list = dao.findByWriter(vo);
ArrayList<MyBoardDto> dtoList = new ArrayList<>();
for(Myboard entity:list) {
dtoList.add(new MyBoardDto(entity.getNum(), entity.getWriter(), entity.getWdate(), entity.getTitle(), entity.getContent()));
}
return dtoList;
}
- findBy컬럼명Like(컬럼타입 값) : like 패턴 검색
---- % 나 _ 를 원하는 검색 결과에 맞게 써줘야 함.
public ArrayList<MyBoardDto> getBoardByTitle(String title){
// like 검색에 %도 쓸 수 있고 _도 쓸 수 있으니까 service에서 원하는 모양으로 붙여주기~
ArrayList<Myboard> list = dao.findByTitleLike("%"+title+"%");
ArrayList<MyBoardDto> dtoList = new ArrayList<>();
for(Myboard entity:list) {
dtoList.add(new MyBoardDto(entity.getNum(), entity.getWriter(), entity.getWdate(), entity.getTitle(), entity.getContent()));
}
return dtoList;
}
- findBy컬럼1And컬럼2(컬럼1타입 값1, 컬럼2타입 값2) : where 컬럼1 == 값1 and 컬럼2 == 값2
- findBy컬럼1Or컬럼2(컬럼1타입 값1, 컬럼2타입 값2) : where 컬럼1 == 값1 or 컬럼2 == 값2
- findBy컬럼명LessThan(컬럼타입 값) : where 컬럼 < 값
- findBy컬럼명GreaterThan(컬럼타입 값) : where 컬럼 > 값
- findBy컬럼명Between(컬럼타입 값1, 컬럼타입 값2) - where 컬럼 between 값1 and 값2
ArrayList<MyProduct> findByPriceBetween(int p1, int p2);
public ArrayList<MyProductDto> getByPrice(int p1, int p2){
ArrayList<MyProduct> list = (ArrayList<MyProduct>) dao.findByPriceBetween(p1, p2);
ArrayList<MyProductDto> dtoList = new ArrayList<MyProductDto>();
for(MyProduct entity:list) {
dtoList.add(new MyProductDto(entity.getNum(), entity.getName(), entity.getPrice(),entity.getAmount()));
}
return dtoList;
}
- findBy컬럼1OrderBy컬럼2Asc/Desc(컬럼1타입 값1, 컬럼2타입 값2) - where 컬럼 1 == 값1 order by 컬럼2 desc
(**) 조인 컬럼
ArrayList<FK테이블> findByWriter(PK테이블 변수명);
-- 파라메터 타입은 컬럼 타입과 동일해야함
ArrayList<Myboard> findByWriter(Mymember writer);
1. JPA 환경 설정
(1) 프로젝트 생성할 때 Spring Data JPA 의존성 주입하기~

(2) application.properties 에 jpa 코드 추가하기
#jpa
spring.jpa.generate-ddl=true
spring.jpa.database=oracle
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
// 자동으로 테이블 생성해줌.
만약 vo 코드를 수정하면 테이블을 자동으로 수정해주지 않고~! 테이블을 새로 생성해줌.
계속 테이블이 생성되는 것이 번거롭다면 false로 해라~
spring.jpa.database=oracle
// db 종류
spring.jpa.show-sql=true
// sql 쿼리문이 실행되면 실행된 쿼리문이 콘솔창에 찍힘.
(3) Vo 를 신중히 만들기
- Vo 파일 이름을 만들고자 하는 spl 테이블 이름으로 지어야 함
!! 안전하게 하려면 !!
- 멤버변수를 모두 소문자
- Vo 이름은 첫글자만 대문자로
2. JPA
- JPA는 db 자동화 프레임워크다. orm.
- db에서 테이블 생성 => 똑같은 이름, 컬럼명과 똑같은 멤버변수를 가지는 vo 정의.
(1) Vo 와 Dto를 분리시켜 쓴다.
DB (sql) |
▶▶▶▶ ◁◁◁◁ |
Web View |
||
Entity (Vo) |
Dto | dao, service, controller | ||
DB 에 값을 담는 객체 | 데이터를 이동시키는 객체 | 기능 메서드 |
-- Vo (Value Object) : 값을 담는 객체
-- Dto (Data Transfer Object) : 데이터를 이동시키는 객체
- jpa 에서 vo는 자바에서 짠 sql table 이 되고, dto는 그동안 써온 Vo의 역할을 한다.
sql 테이블에 저장할 값과 서버 내에서 돌아갈 값이 다른 경우 용이하다.
(ex. multipart 같이 이미지 파일은 db에 안넣어도 됨)
dto를 거치지 않고 sql 멤버변수와 임시 멤버변수가 vo에 다 있을 경우 .. 꼭 필요하지 않은 값들이 뷰 까지 가게 되고,
거기서 원치않는 수정이 일어날 위험이 있다.
@Entity : 테이블 클래스 정의.
- 지정된 vo 클래스와 동일한 이름의 테이블이 자동으로 생성. (MyMember -> my_member)
- 이 클래스의 멤버변수와 동일한 이름과 타입의 컬럼 생성.
@Id - primary key 지정
@Table(name="테이블명") - vo 클래스 이름과 다르게 테이블을 생성하고 싶을 때 name 속성에 사용할 테이블 이름 작성
@Column(name="컬럼명", nullable=true/false) : 컬럼의 이름과 속성을 설정
@Transient -이 멤버변수는 컬럼에서 제외. ( @Entity 안에 @Transient 쓰거나(Dto 안쓸경우), vo에 쓰지 않고 Dto에 쓰면 됨)
@PrePersist - insert문 실행 전에 먼저 처리
▼ Entity (Vo)
package com.example.demo.board;
import java.util.Date;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import com.example.demo.member.Mymember;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.persistence.SequenceGenerator;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Entity
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Myboard {
@Id
@SequenceGenerator(name="seq_gen", sequenceName="seq_myboard", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_myboard")
private int num;
// @ManyToOne(n:1) -- 여러 글을 한 사람이 쓸 수 있음
// @OneToOne(1:1) -- 한 사람이 하나만 만들 수 있음
// @OneToMany(1:n) -- 한 사람이 여러 글을 쓸 수 있음
// @ManyToMany(n:n) -- 여러 사람이 여러 글을 쓸 수 있음 (..?)
@ManyToOne
@JoinColumn(nullable=false) // fk 설정
@OnDelete(action = OnDeleteAction.CASCADE) // on delete cascade
private Mymember writer; // 검색할 때마다 테이블을 조인해서 writer에 대한 정보를 모두 보여줌..
private Date wdate; // java.util.Date 로 import
private String title;
private String content;
@PreUpdate
@PrePersist //insert문 실행 전에 먼저 처리
public void sysdate() {
wdate = new Date();
}
}
▼ Dto
package com.example.demo.board;
import java.util.Date;
import com.example.demo.member.Mymember;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class MyBoardDto {
private int num;
private Mymember writer;
private Date wdate;
private String title;
private String content;
}
(+) 자동 할당
@GeneratedValue - 값을 자동으로 생성해서 할당
(db 종류에 따라 자동 할당하는 방법이 다름)
* mysql - @GeneratedValue(strategy = GenerationType.IDENTITY)
create table tbl1(
num int primary key auto_increment,
name varchar2(10) not null
);
* oracle - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="seq_myproduct")
@SequenceGenerator(name="seq_gen", sequenceName="seq_myproduct", allocationSize=1)
create table tbl2(
num number primary key,
name varchar2(20) not null
);
create sequence seq_tbl2;
insert into tbl2 values(seq_tbl2.nextval, 'aaa');
오라클은 시퀀스를 생성해줘야 함.
- sequenceName : 사용할 시퀀스 이름
- allocationSize : 캐쉬에 담을 값의 개수 ( 캐쉬 : 자주 사용하는 값을 담아놓는 메모리 )
---- allocationSize를 할당하지 않으면 기본값(50) 까지 메모리에 올려놓고 빠르게 꺼내올 수 있음.
그러나 db를 껐다가 켜면 할당된 값은 이미 소모되었기 때문에 1, 2, 52 이렇게 한번에 숫자가 뛸 수 있음.
그게 싫으면 allocationSize를 할당해주면 됨. (근데 안됨 왜 안될까 뭐때문에 안될까)
db를 끌 일이 별로 없으면 기본값으로 가는게 속도가 빨라서 좋음~
(2) Dao는 interface 클래스로, JpaRepository를 상속받는다.
- 인터페이스가 인터페이스를 상속받는 키워드도 extends 다.
JpaRepository<Entity 클래스명, pk 타입> 인터페이스를 상속받아 만든다.
- 이 인터페이스의 구현은 jpa 프레임워크가 자동으로 함.
@Repository
public interface ProductDao extends JpaRepository<MyProduct, Integer> {
// 컬럼명의 타입과 파라메터 타입이 같아야 함.
ArrayList<MyProduct> findByName(String name); // 제품명이 정확히 일치한 것만 찾을 수 있음.
ArrayList<MyProduct> findByNameLike(String name);
ArrayList<MyProduct> findByPriceBetween(int p1, int p2);
}
- 메서드 대신 직접 SQL 문을 작성할 수 있다.
@Transactional
@Modifying
@Query(value="update Downfile set cnt=cnt+1 where num=:num", nativeQuery=true)
void updateCnt(@Param("num") int num);
(3) Service에서는 정의된 db 처리 메서드로 기능을 구현한다.
- JpaRepository 는 db 처리 메서드가 정의되어 있음.
(* 여기서 Entity 란 기존의, 지금껏 연습해 온 Vo로, 직접적으로 Sql 과 맞닿아있다.)
(* Dto는 메서드와 Vo 사이의 필터 같은 느낌. 꼭 거쳐가야 함)
- save() : insert, update 실행 메서드.
---- Entity 타입의 객체를 파람으로 받고 방금 쓴 줄을 Entity 타입으로 변환.
파라메터 Entity 의 pk 값이 db에 없으면 insert 실행, 있으면 Update 를 실행.
update로 실행되면 모든 컬럼 수정됨. => 수정할 때 수정하지 않을 값도 다 넣어줘야 수정이 된다~
public void saveMember(MyMemberDto dto) {
dao.save(new Mymember(dto.getId(), dto.getPwd(), dto.getName(), dto.getEmail()));
}
- findAll() : 파라메터 없음. 전체 검색한 결과를 Entity 의 list로 변환.
public ArrayList<MyBoardDto> getAllBoard(){
ArrayList<Myboard> list = (ArrayList<Myboard>) dao.findAll();
ArrayList<MyBoardDto> dtoList = new ArrayList<MyBoardDto>();
for(Myboard entity:list) {
dtoList.add(new MyBoardDto(entity.getNum(), entity.getWriter(), entity.getWdate(), entity.getTitle(), entity.getContent()));
}
return dtoList;
}
- findById(pk) : pk 기준 검색/ 한 줄 검색되거나 검색 안됨. ==> 검색 안되면 예외 발생 => .orElse(null);
public MyMemberDto getMember(String id) {
Mymember entity = dao.findById(id).orElse(null);
if(entity == null) {
return null;
}
return new MyMemberDto(entity.getId(), entity.getPwd(), entity.getName(), entity.getEmail());
}
- deleteById(pk) - pk 기준 한줄 삭제
public void delBoard(int num) {
dao.deleteById(num);
}
- findBy컬러명(컬럼타입 값) : 컬럼 기준 검색.
---- 한 줄 검색이면 Entity를, 여러줄 검색이면 ArrayList<Entity> 를 반환타입으로 저장.
ArrayList<Myboard> findByWriter(Mymember writer);
public ArrayList<MyBoardDto> getBoardByWriter(String writer){
Mymember vo = new Mymember(writer, "", "", "");
ArrayList<Myboard> list = dao.findByWriter(vo);
ArrayList<MyBoardDto> dtoList = new ArrayList<>();
for(Myboard entity:list) {
dtoList.add(new MyBoardDto(entity.getNum(), entity.getWriter(), entity.getWdate(), entity.getTitle(), entity.getContent()));
}
return dtoList;
}
- findBy컬럼명Like(컬럼타입 값) : like 패턴 검색
---- % 나 _ 를 원하는 검색 결과에 맞게 써줘야 함.
public ArrayList<MyBoardDto> getBoardByTitle(String title){
// like 검색에 %도 쓸 수 있고 _도 쓸 수 있으니까 service에서 원하는 모양으로 붙여주기~
ArrayList<Myboard> list = dao.findByTitleLike("%"+title+"%");
ArrayList<MyBoardDto> dtoList = new ArrayList<>();
for(Myboard entity:list) {
dtoList.add(new MyBoardDto(entity.getNum(), entity.getWriter(), entity.getWdate(), entity.getTitle(), entity.getContent()));
}
return dtoList;
}
- findBy컬럼1And컬럼2(컬럼1타입 값1, 컬럼2타입 값2) : where 컬럼1 == 값1 and 컬럼2 == 값2
- findBy컬럼1Or컬럼2(컬럼1타입 값1, 컬럼2타입 값2) : where 컬럼1 == 값1 or 컬럼2 == 값2
- findBy컬럼명LessThan(컬럼타입 값) : where 컬럼 < 값
- findBy컬럼명GreaterThan(컬럼타입 값) : where 컬럼 > 값
- findBy컬럼명Between(컬럼타입 값1, 컬럼타입 값2) - where 컬럼 between 값1 and 값2
ArrayList<MyProduct> findByPriceBetween(int p1, int p2);
public ArrayList<MyProductDto> getByPrice(int p1, int p2){
ArrayList<MyProduct> list = (ArrayList<MyProduct>) dao.findByPriceBetween(p1, p2);
ArrayList<MyProductDto> dtoList = new ArrayList<MyProductDto>();
for(MyProduct entity:list) {
dtoList.add(new MyProductDto(entity.getNum(), entity.getName(), entity.getPrice(),entity.getAmount()));
}
return dtoList;
}
- findBy컬럼1OrderBy컬럼2Asc/Desc(컬럼1타입 값1, 컬럼2타입 값2) - where 컬럼 1 == 값1 order by 컬럼2 desc
(**) 조인 컬럼
ArrayList<FK테이블> findByWriter(PK테이블 변수명);
-- 파라메터 타입은 컬럼 타입과 동일해야함
ArrayList<Myboard> findByWriter(Mymember writer);