๐งฉ 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_
