[Spring_Boot] SOLID์›์น™, JPA

์ตœํ˜„์„ยท2022๋…„ 11์›” 22์ผ
0

Spring_Boot

๋ชฉ๋ก ๋ณด๊ธฐ
5/31
post-thumbnail

๐Ÿงฉ 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 : jpa๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” class
@Entity
public class Member {
	// @Id -> id๊ฐ€ pk๊ฐ’์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์คŒ
	@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySequence")
	@SequenceGenerator(name="mySequence",sequenceName = "member_seq", allocationSize = 1)
   
   // DB์—์„œ id์—๋Œ€ํ•œ PK,seq ์„ค์ •ํ•ด๋†“์Œ
	private int id;
    
    // ํ…Œ์ด๋ธ”๋ช… ์ปฌ๋Ÿผ๋ช…์„ ๋ฐ”๊ฟ”์ค„ ์ˆ˜ ์žˆ๋‹ค
	//@Column(name="username")
	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 {

	// JPA๋Š” EntityManager๋กœ ๋ชจ๋“ ์ง€ ๋™์ž‘ ํ•œ๋‹ค.
	private final EntityManager em;
	public JpaMemberRepository(EntityManager em) {
		this.em = em;
	}

	
	@Override
	public Member save(Member member) {
      	// insert๊ฐ€ ๋Œ
		em.persist(member);
		return member;
	}

	@Override
	public List<Member> findAll() {
		return em.createQuery("select m from Member m", Member.class)
				 .getResultList();
		// select m from Member m : JPQL์ด๋ผ๋Š” ์ฟผ๋ฆฌ
	}

}

๐Ÿ’Š MemberService

  • @Transactional - springframework ์ž…๋ ฅ
@Service
@Transactional
public class MemberService {
	// Service์—์„œ join๋ฉ”์„œ๋“œ์™€ findMembers๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํšŒ์›๊ฐ€์ž…๊ณผ ์ „์ฒดํšŒ์›์กฐํšŒ
	
	// ๊ฐ์ฒด๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค
//	MemberRepository memberRepository = new MemoryMemberRepository();
	
	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_

0๊ฐœ์˜ ๋Œ“๊ธ€