-
TIL(23์ผ์ฐจ)(2021.11.13)TIL(Today I Learned) 2021. 11. 13. 14:31
TIL(2021.11.13)
spring data JPA๐
- ๊ฐ๋ฐ ์์ฐ์ฑ ๋ํญ ์ฆ๊ฐ
- ๋ฆฌํฌ์งํ ๋ฆฌ์ ๊ตฌํ ์์ด๋ ์ธํฐํ์ด์ค ๋ง์ผ๋ก ๊ฐ๋ฐ์ ์๋ฃํ ์ ์๋ค.
- ๊ธฐ๋ณธ CRUD ๊ธฐ๋ฅ๋ ๋ชจ๋ ์ ๊ณต
- ๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ๋ฐํ๋๋ฐ ์ง์คํ ์ ์๊ฒ๋๋ค.
//SpringDataJpaMemberRepository.java public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository { @Override Optional<Member> findByName(String name); }
- ๋ฐ์ดํฐ JPA๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ์์ ์๋์ผ๋ก ๊ตฌํ์ฒด์ ์คํ๋ง๋น์ ๋ง๋ค์ด์ค๋ค.
- JpaRepository๋ jpa์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ๋ก ๋ฐ์ดํฐ jpa๊ฐ ์ธํฐํ์ด์ค๋ง ๋ฐ๊ณ ๊ตฌํ์ฒด๋ฅผ ์๋์ผ๋ก ๊ตฌํํด์ฃผ๋๊ฒ์ ๋์์ฃผ๊ณ , ์คํ๋ง๋น์ ๋ฑ๋กํด์ค๋ค.
- JpaRepository๋ ๊ธฐ๋ณธ์ ์ธ CRUD๊ฐ ๋ชจ๋ ์ ๊ณต๋๋ค.(findById, save, findByName.. ๋ฑ)
- Optional findByName(String name);๋ฅผ ๊ตฌํํ๋ฉด ์๋์ผ๋ก JPQL์ด ์์ฑ๋๋ค.
- findByName๋ถ๋ถ์ด ์ธํฐํ์ด์ค ์ญํ ์ด๋ค. ์ด ๋ถ๋ถ์ ์์ ํ๋ฉด ์๋ก๋ค๋ฅธ ๊ฐ์ฒด ์ด๋ฆ์ ๋ณด์ํ ์ ์๋ค.
- ํ์ด์ง ๊ธฐ๋ฅ ์๋ ์ ๊ณต
- ์ฐธ๊ณ : ์ค๋ฌด์์๋ ์คํ๋ง ๋ฐ์ดํฐ JPA๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ ๋ณต์กํ ๋์ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌํํด์ผํ ๋๋, Querydsl์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
- ์ด๋ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์๋ฐ๋ก ํธ๋ฆฌํ๊ฒ ์์ฑํ ์ ์๋ค.
- ์ด ์กฐํฉ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ์ฟผ๋ฆฌ๋ ๋ค์ดํฐ๋ธ JPA ๋๋ JdbcTemplate๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
//SpringConfig.java private final MemberRepository memberRepository; public SpringConfig(MemberRepository memberRepository) { this.memberRepository = memberRepository; } @Bean public MemberService memberService(){ return new MemberService(memberRepository); }
AOP(Aspect Oriented Programming)๐
- ๋ชจ๋ ๋ฉ์๋์ ํธ์ถ ์๊ฐ์ ์ธก์ ํ ๋ ํ์.
- ํธ์ถ ์๊ฐ์ ์ธก์ ํ๋ ๊ฒ์ ํต์ฌ ์ฌํญ์ด ์๋๋ค.
- ๊ณตํต ๊ด์ฌ ์ฌํญ ๋ํ ์๋๋ค.
- ๋ก์ง์ด ๋ค์์ผ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ค.
- ๊ณตํต ๋ก์ง์ผ๋ก ๋ง๋ค๊ธฐ ๋งค์ฐ ์ด๋ ต๋ค.
- ๋ชจ๋ ๋ก์ง์ ์ฐพ์๊ฐ๋ฉด์ ๋ณ๊ฒฝํด์ผ ํ๋ค.
- ๊ณตํต ๊ด์ฌ ์ฌํญ(cross-cutting concern) vs ํต์ฌ ๊ด์ฌ ์ฌํญ(core concern)
- ๊ณตํต ๊ด์ฌ ์ฌํญ : ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ์ฌํญ
- ํต์ฌ ๊ด์ฌ ์ฌํญ : ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌ์ฑํ๋ ํต์ฌ ์ฌํญ.
- AOP๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํต์ฌ ๊ด์ฌ ์ฌํญ๊ณผ ์ ์ฒด์ ์ ์ฉ๋๋ ๊ณตํต ๊ด์ฌ ์ฌํญ์ ๋ถ๋ฆฌ ํ์ฌ ๊ตฌํํ๋๊ฒ์ ์๋ฏธํ๋ค.
//TimeTraceAop.java @Aspect @Component public class TimeTraceAop { @Around("execution(* hello.hellospring..*(..))") // ํจํค์ง๋ช .ํด๋์ค๋ช .ํ๋ผ๋ฏธํฐ๋ช ์ค์ public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); System.out.println("START: " + joinPoint.toString()); try{ return joinPoint.proceed(); } finally { long finish = System.currentTimeMillis(); long timeMs = finish - start; System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms"); } } }
- AOP ๊ตฌํ ์์
- @Aspect๋ฅผ ์ ์ธํด์ AOP๋ฅผ ์ฌ์ฉํ๊ณ , @Component๋ฅผ ์ ์ธํด์ ์คํ๋ง๋น์ ๋ฑ๋กํด์ค๋ค.
- ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ SpringConfig๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ค. ์๋ ์ฝ๋๊ฐ ์์์ด๋ค.
//SpringConfig @Bean public TimeTraceAop timeTraceAop(){ return new TimeTraceAop(); }
- ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง๋ค ์ค๊ฐ์ ์ธํฐ์ ํธํด์ ์ค์ ํ ๊ธฐ๋ฅ์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ํ๋ค.
- @Around("execution(* hello.hellospring..*(..))") // ์ํ๋ ์ ์ฉ ๋์ ์ค์
- ์๋ก ์์ฑ๋ Proxy๊ฐ ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋ ์ฌ์ด์์ ์คํํ๋ค.
//memberService.java // @Autowired public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; System.out.println("memberRepository.getClass() = " + memberRepository.getClass()); }
- System.out.println("memberRepository.getClass() = " + memberRepository.getClass());๋ฅผ ์ ์ธํด์ Proxy๊ฐ ์คํ๋๋์ง ํ์ธํ ์ ์๋ค.
- proxy๊ฐ ์คํ๋๊ณ , joinPoint.proceed()๊ฐ ์คํ๋๋ฉด ๊ทธ๋ ์ค์ memberService๊ฐ ์คํ๋๋ ์๋ฆฌ์ด๋ค.
spring ํต์ฌ ๊ฐ๋ ๐
- ์๋ฐ ์ธ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ ํ๋ ์์ํฌ ์ฆ, ๊ฐ์ฒด ์งํฅ ์ธ์ด
- ๊ฐ์ฒด์งํฅ์ธ์ด๊ฐ ๊ฐ์ง ๊ฐ๋ ฅํ ํน์ง์ ์ด๋ ค๋ด๋ ํ๋ ์์ํฌ
Spring Data
- DB์ CRUD๋ฅผ ํธ๋ฆฌํ๊ฒ ์์ฑํ๋๋ก ๋์์ฃผ๋๊ฒ
Spring Session
- ์ธ์ ๊ธฐ๋ฅ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค
Spring Security
- ๋ณด์
Spring Rest Docs
- API(Restful Service) ๋ฌธ์ํ๋ฅผ ํธ๋ฆฌํ๊ฒ ํด์ฃผ๋๊ฒ
Spring Batch
- ๊ฑฐ๋ํ ํฌ๊ธฐ์ ํธ๋ํฝ, ๊ธฐ๋ก ์ฒ๋ฆฌ, ์์ ์ฒ๋ฆฌ ํต๊ณ, ์์ ์ฌ์์, ๋ฆฌ์์ค ๊ด๋ฆฌ ๋ฑ ๋๋์ ๋ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ํ์์ ์ธ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Spring Cloud
- ์ต๊ทผ ํด๋ผ์ฐ๋ ๊ธฐ์ ์ ์ ๋ชฉ๋ spring technic
Spring Boot
- ์์ ์ค๋ช ํ Spring ํ๋ก์ ํธ๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ํ๋ก๊ทธ๋จ
- ๋จ๋ ์ผ๋ก ์คํํ ์ ์๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ์์ฑ(Tomcat์ด ์๋์ผ๋ก ์์ฑ๋จ. ๋ณ๋์ ์น์๋ฒ๋ฅผ ์ค์นํ์ง ์์๋ ๋จ.)
- ์์ฌ์ด ๋น๋ ๊ตฌ์ฑ์ ์ํ starter ์ข ์์ฑ์ ์ ๊ณตํด์ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํจ๊ป ๋ฐ์์ค
- ์คํ๋ง๊ณผ 3rd parth(์ธ๋ถ) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ ๊ตฌ์ฑํด์ค์, ๋ณ๋๋ก ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋์ด ํธ๋ฆฌํด์ก๋ค.
- ํ๊ฒฝ์ ๊ดํ ํ๋ก๋์ ์ค๋น ๊ธฐ๋ฅ ์ ๊ณต
- ๊ด๋ก์ ์ํ ๊ฐ๊ฒฐํ ์ค์ (๊ธฐ๋ณธ default ์ค์ ์ด ์๋์ด์์ด์ ๋ฐ๋ก ์์ ํ ์ผ์ด ์๋ค. ๋ง์ฝ ์๋ค๋ฉด ๋ฐ๋ก custom ํ๋ฉด๋๋ค.)
Spring FrameWork ๐
- ํต์ฌ ๊ธฐ์ : ์คํ๋ง DI ์ปจํ ์ด๋, AOP, ์ด๋ฒคํธ, ๊ธฐํ
- ์น ๊ธฐ์ : Spring MVC, Spring WebFlux
- ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ : Transaction, JDBC, ORM ์ง์, XML ์ง์
- ๊ธฐ์ ํตํฉ : ์บ์, ์ด๋ฉ์ผ, ์๊ฒฉ์ ๊ทผ, ์ค์ผ์ค๋ง
- ํ ์คํธ : ์คํ๋ง ๊ธฐ๋ฐ ํ ์คํธ ์ง์
- ์ธ์ด : ์ฝํ๋ฆฐ, ๊ทธ๋ฃจ๋น
- ์ต๊ทผ์๋ ์คํ๋ง ๋ถํธ๋ฅผ ํตํด ์คํ๋ง ํ๋ ์์ํฌ์ ๊ธฐ์ ๋ค์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ข์ ๊ฐ์ฒด ์งํฅ ํน์ง ๐
(๋คํ์ฑ/Polymorphism )
- ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ์ฌ ๋๊ท๋ชจ ํ๋ก์ ํธ์ ์ฉ์ดํ๊ฒ.
- ๋ ๊ณ ๋ธ๋ญ ์กฐ๋ฆฝํ๋ฏ์ด
- ํค๋ณด๋, ๋ง์ฐ์ค ๊ฐ์ ๋ผ์ฐ๋ฏ์ด
- ์ปดํจํฐ ๋ถํ ๊ฐ์ ๋ผ์ฐ๋ฏ์ด
- ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ณ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ๋ฉด์ ๊ฐ๋ฐํ ์ ์๋ ๋ฐฉ๋ฒ
- ์ญํ ๊ณผ ๊ตฌํ์ผ๋ก ๊ตฌ๋ถ, ๋จ์์ฑ, ์ ์ฐ์ฑ์ผ๋ก ์ธํ ๋ณ๊ฒฝ์ด ํธ๋ฆฌ
- ํด๋ผ์ด์ธํธ๋ ์ธํฐํ์ด์ค(์ญํ )๋ง ์๋ฉด๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ํ์๊ฐ ์๊ณ , ๋ณ๊ฒฝ๋์ด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์ ์์ฒด๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.(ex) ์ปดํจํฐ ํค๋ณด๋ ๋ง์ฐ์ค, ๋ ธํธ๋ถ LG, ์ผ์ฑ)
- ๊ฐ์ฒด๋ฅผ ์ค๊ณํ ๋, ์ญํ (์ธํฐํ์ด์ค)๊ณผ ๊ตฌํ(ํด๋์ค, ๊ตฌํ ๊ฐ์ฒด)๋ฅผ ๋ช ํํ ๋ถ๋ฆฌ. ์ธํฐํ์ด์ค๋ฅผ ๋จผ์ ๋ง๋ค๊ณ , ๊ตฌํ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
- 'ํ๋ ฅ', ํด๋ผ์ด์ธํธ : ์์ฒญ, ์๋ฒ : ์๋ต
- ์๋ฐ ์ธ์ด์ ๋คํ์ฑ : ๋คํ์ฑ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค
public class MemberService { // private MemberRepository memberRepository = new MemoryMemberRepository(); private MemberRepository memberRepository = new JdbcMemberRepository(); }
- ์ค๋ฒ๋ผ์ด๋ฉ
- ๋คํ์ฑ์ ๋ณธ์ง์ ํ๋ ฅ์ด๋ผ๋ ๊ฐ์ฒด์ฌ์ด์ ๊ด๊ณ์์ ์์
- ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ฒ์ ๊ตฌํ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
- ์ธํฐํ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ์ค๊ณํ๋๊ฒ์ด ์ค์ํ๋ค.
๋คํ์ฑ์ ํ๊ณ์
- ์ญํ (์ธํฐํ์ด์ค) ์์ฒด๊ฐ ๋ณํ๋ฉด, ํด๋ผ์ด์ธํธ, ์๋ฒ ๋ชจ๋์ ํฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ค.
- ์๋ก ์๋์ฐจ๊ฐ ๋นํ๊ธฐ๋ก ๋ณํ๋ฉด?
- ๋๋ณธ ์์ฒด๊ฐ ๋ณํ๋ค๋ฉด?
- USB ์ธํฐํ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด?
- ๊ฒฐ๋ก : ์ธํฐํ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ์ ์ค๊ณํ๋๊ฒ์ด ์ค์
๊ฒฐ๋ก
- ๋คํ์ฑ์ด ๊ฐ์ฅ ์ค์!
- ์คํ๋ง์ ๋คํ์ฑ์ ๊ทน๋ํํด์ ์ด์ฉํ ์ ์๊ฒ ๋์์ค๋ค.
- ์คํ๋ง์์ ์ด์ผ๊ธฐํ๋ ์ ์ด์ ์ญ์ (IOC), ์์กด๊ด๊ณ ์ฃผ์ (DI)๋ ๋คํ์ฑ์ ํ์ฉํด์ ์ญํ ๊ณผ ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ์ง์
- ์คํ๋ง์ ์ฌ์ฉํ๋ฉด ๋ง์น ๋ ๊ณ ๋ธ๋ญ ์กฐ๋ฆฝํ๋ฏ์ด! ๊ณต์ฐ ๋ฌด๋ ๋ฐฐ์ฐ๋ฅผ ์ ํํ๋ฏ์ด! ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
- ์คํ๋ง์ ๋คํ์ฑ์ ๊ทน๋ํํด์ ์ด์ฉํ ์ ์๊ฒ ๋์์ค๋ค.
'TIL(Today I Learned)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TIL 25์ผ์ฐจ (2021.11.15) (0) 2021.11.15 TIL(24์ผ์ฐจ)(2021.11.14) (0) 2021.11.14 TIL(22์ผ์ฐจ)(2021.11.12) (0) 2021.11.12 TIL 21์ผ์ฐจ(11.11) (0) 2021.11.11 TIL 20์ผ์ฐจ (2021.11.10) (0) 2021.11.10