๐งฉ SOLID
- ํด๋ฆฐ์ฝ๋๋ก ์ ๋ช
ํ ๋ก๋ฒํธ ๋งํด์ด ์ข์ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น์ ์ ๋ฆฌ
- SRP : ๋จ์ผ ์ฑ
์ ์์น
- OCP : ๊ฐ๋ฐฉ-ํ์ ์์น
- LSP : ๋ฆฌ์ค์ฝํ ์นํ ์์น
- ISP : ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
- DIP : ์์กด๊ด๊ณ ์ญ์ ์์น
1) ๊ฐ๋ฐฉ-ํ์ ์์น
- ํ์ฅ์๋ ์ด๋ ค์๊ณ , ์์ , ๋ณ๊ฒฝ์๋ ๋ซํ์๋ค.
2) ๋จ์ผ ์ฑ
์ ์์น
- ํ ํด๋์ค๋ ํ๋์ ์ฑ
์๋ง ๊ฐ์ ธ์ผ ํ๋ค.
- ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ์ผ๋ฉด ๋จ์ผ ์ฑ
์ ์์น์ ์ ๋ฐ๋ฅธ ๊ฒ
3) ๋ฆฌ์ค์ฝํ ์นํ ์์น
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์
์
์ธ์คํดํธ๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
- ๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผ ํ๋ค๋ ๊ฒ.
4) ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
- ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋ ๋ณด๋ค ์ธํฐํ์ด์ค ์ฌ๋ฌ๊ฐ ๋ซ๋ค.
- ์ธํฐํ์ด์ค๊ฐ ๋ช
ํํด์ง๊ณ , ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
5) ์์กด๊ด๊ณ ์ญ์ ์์น
- ํ๋ก๊ทธ๋๋จธ๋ ์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํด์๋ ์๋๋ค.
- ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ , ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป
๐งฉ JPA
- JPA๋ ๊ธฐ์กด์ ๋ฐ๋ณต ์ฝ๋๋ ๋ฌผ๋ก ์ด๊ณ , ๊ธฐ๋ณธ์ ์ธ SQL๋ JPA๊ฐ ์ง์ ๋ง๋ค์ด์ ์คํํด์ค๋ค.
- JPA๋ฅผ ์ฌ์ฉํ๋ฉด, SQL๊ณผ ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ์์ ๊ฐ์ฒด ์ค์ฌ์ ์ค๊ณ๋ก ํจ๋ฌ๋ค์์
์ ํํ ์ ์๋ค.
- JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ ์์ฐ์ฑ์ ํฌ๊ฒ ๋์ผ ์ ์๋ค.
- JPA(Java Persistence API)
- JPA๋ ์๋ฐ ์์ญ์์ ORM(Object - Relational Mapping) ๊ธฐ์ ํ์ค์ผ๋ก
์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค์ ๋ชจ์์ด๋ค.
- ์ฆ, ์ค์ ์ ์ผ๋ก ๊ตฌํ๋๊ฒ์ด ์๋๋ผ ๊ตฌํ๋ ํด๋์ค์ ๋งคํ์ ํด์ฃผ๊ธฐ ์ํด
์ฌ์ฉ๋๋ ํ๋ ์์ํฌ์ด๋ค.
๐งฉ JPQL(Java Persistence Query Language)
- ํ
์ด๋ธ์ด ์๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๊ฒ์ํ๋ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ
- SQL์ ์ถ์ํํด์ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค SQL์ ์์กดํ์ง ์์
- JPA๋ JPQL์ ๋ถ์ ํ ์ ์ ํ SQL์ ๋ง๋ค์ด ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์กฐํ
๐งฉํ์์ ์ฅ JPA ์ค์ต
๐ build gradle
dependencies {
//์ฃผ์์ฒ๋ฆฌ
//implementation 'org.springframework.boot:spring-boot-starter-jdbc'
// ์ถ๊ฐ
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
๐ application properties
#jpa
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
๐Member.java
- ๊ฐ์ฒด ํด๋์ค(๊ฐ๋ฐ์ ์ค์ฌ)๋ฅผ ๊ธฐ์ ์ผ๋กํด์ DB๋ฅผ ์ค๊ณ
- JPA๊ฐ DB์ฒ๋ผ ๊ด๋ฆฌํจ
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySequence")
@SequenceGenerator(name="mySequence",sequenceName = "member_seq", allocationSize = 1)
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
๐ JpaMemberRepository
- JPA๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด Repository๊ฐ EntityManager์ฃผ์
๋ฐ์์ผํ๋ค.
@Repository
public class JpaMemberRepository implements MemberRepository {
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
@Override
public Member save(Member member) {
em.persist(member);
return member;
}
@Override
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
}
๐ MemberService
- @Transactional - springframework ์
๋ ฅ
@Service
@Transactional
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public int join(Member member) {
memberRepository.save(member);
return member.getId();
}
public List<Member> findMembers(){
return memberRepository.findAll();
}
}
๐ ๊ฒฐ๊ณผ
- JPA๊ฐ ๋ณด๋ด์ฃผ๋ ์ฟผ๋ฆฌ๋ฌธ
Hibernate: select memberseq.nextval from dual
Hibernate: insert into member (name, id) values (?, ?)
Hibernate: select member0.id as id10, member0.name as name2_0 from member member0_