ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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());
        }

    image

    • 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
Designed by Tistory.