Framework/Spring Framework

(22.12.28)Spring ํ”„๋ ˆ์ž„์›Œํฌ: JPA ์—ฐ๋™ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๊ธฐ (๊ธฐ์ดˆ)

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2022. 12. 29.

Spring ์—์„œ JPA๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๊ธฐ

 

 

Spring DataBase
- JDBC
- JdbcTemplate
- MyBatis
- JPA(Java Persistence API)

 

 

 

JPA ์„ค์ •

-application.properties

 

 

-pom.xml : dependency ์ถ”๊ฐ€

 

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa

 

 

 

 

VO CLASS

JPA์—์„  VO๊ฐ€ ํ•„์š”ํ•˜๋‹ค : Entity (DB์†์„ฑ์˜ ์ง‘ํ•ฉ)
Entity -> ํ…Œ์ด๋ธ” ์ƒ์„ฑ (DB๋ชจ๋ธ๋งํ• ๋•Œ ์„ค๊ณ„๋‹จ๊ณ„์—์„œ ์“ฐ๋Š” ์šฉ์–ด.)
 - ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ๋ถ€์„œ, ๊ธ‰์—ฌ, ์ž…์‚ฌ <-- ์ปฌ๋Ÿผ๋ช…

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.SequenceGenerator;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
 
@Data
@ToString
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name="emp4")
public class Emp 
{
    @Id
    @SequenceGenerator(sequenceName = "EMP4_EMPNO_SEQ", allocationSize =1, name="EMP4_EMPNO_GEN" )
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="EMP4_EMPNO_GEN")
    private int empno;
    
    @Column(name="ename")
    private String name;
    
    private int deptno;
    private int sal;
    private java.sql.Date hiredate;
    
}
cs

 

 

INTERFACE


์ธํ„ฐํŽ˜์ด์Šค (๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ ๊ธฐ๋Šฅ์„ ๋‹ด๊ฒŒ๋˜๋Š” ->) : JpaRepository์ƒ์† ( ๊ธฐ๋ณธ์ ์œผ๋กœ CRUD์™€ ๊ด€๋ จ๋œ๊ฑด ๋‹ค ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.)

-๋‹จ์ˆœํ•œ ์ž…์ถœ๋ ฅ ๊ธฐ๋Šฅ์€ ๋ฏธ๋ฆฌ ์ค€๋น„๋˜์–ด ์žˆ์Œ.

-์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์ค€์•ผ ํ•œ๋‹ค.

 

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
 
public interface EmpRepository extends JpaRepository<Emp,Integer> {
                            //emp๋Š” ํ…Œ์ด๋ธ”์˜ ์ •์˜ INTEGER๋Š” ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค์˜ ์ž๋ฃŒํ˜•
    Optional<Emp> findByName(String name);
 
    Optional<Emp> findByDeptno(int deptno);
 
    Optional<Emp> findByDeptnoAndName(int deptno,String name);
}
 
cs

 

 

 

Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import java.sql.Date;
import java.util.List;
import java.util.Optional;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
import lombok.extern.slf4j.Slf4j;
 
@Controller
@Slf4j
@RequestMapping("/jpa")
public class JpaController {
    @Autowired
    private EmpRepository repo;
 
    @GetMapping("/")
    @ResponseBody
    public String index() {
        return "JPA Controller Working...";
    }
    
    @GetMapping("/add")
    @ResponseBody
    public String add() {
        Date hiredate = Date.valueOf("2022-12-28");
        Emp emp = new Emp(11,"smith"20,300,hiredate);
        Emp saved = repo.save(emp);
        
        return saved.toString();
    }
    
    @GetMapping("/list")
    @ResponseBody
    public String list() {
        
        List<Emp> saved = repo.findAll();
        
        return saved.toString();
    }
    @GetMapping("/find/{empno}")
    @ResponseBody
    public String findById(@PathVariable int empno) {
        
        //Emp saved = repo.findById(empno).get();
        //Optional์€ ์—†์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋œจ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ null์ด ๋‚˜์˜จ๋‹ค.
        
        Optional<Emp> op = repo.findById(empno);
        if(op.isEmpty()/*op๊ฐ€ null์ธ ๊ฒฝ์šฐ*/) {
            return empno+"๋ฒˆํ˜ธ๋กœ ๊ฒ€์ƒ‰์‹คํŒจ";
        }
        return op.get().toString();
    }
    @GetMapping("/name/{name}")
    @ResponseBody
    public String findByName(@PathVariable String name) {
        
        Optional<Emp> op = repo.findByName(name);
        if(op.isEmpty()) {
            return name+"์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰์‹คํŒจ";
        }
        return op.get().toString();
    }
    @GetMapping("/deptno/{deptno}")
    @ResponseBody
    public String findByDeptno(@PathVariable int deptno) {
        Optional<Emp> op = repo.findByDeptno(deptno);
        if(op.isEmpty()) {
            return deptno+" ๋ถ€์„œ๋ฒˆํ˜ธ๋กœ ๊ฒ€์ƒ‰์‹คํŒจ";
        }
        return op.get().toString();
    }
    //ํŠน์ •๋ถ€์„œ์— ๊ทผ๋ฌดํ•˜๋Š” ์ธ์›์˜ ์ด๋ฆ„ ๊ฒ€์ƒ‰ (WHERE deptno=? and name=?)
    @GetMapping("/finddeptnoandname/{deptno}/{name}")
    @ResponseBody
    public String findByDeptnoAndName(@PathVariable("deptno"int deptno, @PathVariable("name"String name) {
        Optional<Emp> op = repo.findByDeptnoAndName(deptno,name);
        if(op.isEmpty()) {
            return deptno+"/"+name+" ๊ทผ๋ฌด์ž ๊ฒ€์ƒ‰์‹คํŒจ";
        }
        return op.get().toString();
    }
    
    //์ˆ˜์ • : Entity ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ save() ํ•˜๋ฉด ํ•ด๋‹น pk ์ธ ๊ณณ์„ ์ฐพ์•„ ์ˆ˜์ •ํ•ด์ค€๋‹ค.
    //save()๋Š” ์ˆ˜์ • ํ›„ ์ˆ˜์ •๋œ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋ฏ€๋กœ ์ˆ˜์ •์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
    @GetMapping("/update/{empno}/{deptno}/{sal}")
    @ResponseBody
    public String updateByEmpno(@PathVariable int empno,
            @PathVariable int deptno, @PathVariable int sal) {
        Optional<Emp> op = repo.findById(empno);
        if(op.isEmpty()/*op๊ฐ€ null์ธ ๊ฒฝ์šฐ*/) {
            return empno+"๋ฒˆํ˜ธ๋กœ ๊ฒ€์ƒ‰์‹คํŒจ";
        }
        Emp emp = op.get();
        emp.setDeptno(deptno);
        emp.setSal(sal);
        return repo.save(emp).toString();
    }
    @GetMapping("/delete/{empno}")
    @ResponseBody
    public String deleteByEmpno(@PathVariable int empno) {
        Optional<Emp> op = repo.findById(empno);
        if(op.isEmpty()) {
            return empno+"๋ฒˆํ˜ธ๋กœ ๊ฒ€์ƒ‰์‹คํŒจ";
        }
        else repo.deleteById(empno);
        return "์‚ญ์ œ์„ฑ๊ณต";
    }
}
cs

 

 

์‹คํ–‰๊ฒฐ๊ณผ : 

์ถ”๊ฐ€ํ•˜๊ธฐ

 

 

๋ฆฌ์ŠคํŠธ ๋ณด๊ธฐ

 

 

ID๋กœ ์ฐพ๊ธฐ

 

 

 

 

์ด๋ฆ„์œผ๋กœ ์ฐพ๊ธฐ

 

 

 

 

๋ถ€์„œ๋ฒˆํ˜ธ๋กœ ์ฐพ๊ธฐ

 

 

 

 

๋ถ€์„œ๋ฒˆํ˜ธ์™€ ์ด๋ฆ„์œผ๋กœ ์ฐพ๊ธฐ

 

 

๋Œ“๊ธ€