[인프런 워밍업 클럽 1기/BE] 두번째 발자국

[인프런 워밍업 클럽 1기/BE] 두번째 발자국

스프링 컨테이너

  • 스프링이 시작될 때스프링 서버 내부에 거대한 컨테이너를 만듬

     

  • 컨테이너에 들어가는 -> 클래스 -> 들어간 클래스 = 스프링 빈

  • @RestController - Controller 클래스를 API 진입 지점으로 만들고 스프링 빈으로 등록시킴

  • @Repository - Repository를 스프링 빈으로 등록할 때 사용

  • @Service - Service를 스프링 빈으로 등록할 때 사용

 

스프링 컨테이너 사용 이유

  • 제어의 역전(IoC, Inversion of Control) - 컨테이너가 Repository 중 하나를 선택한 후, Service를 만듬. -> Service를 수정하지않고 Repository만 수정하면됨

  • 의존성 주입(Dependency Injection) - 컨테이너가 Service를 만들어 줄때 Repository 중 하나를 선택해서 넣어주는 과정

  • @Primary 어노테이션을 사용해서 우선순위 설정

 

스프링 컨테이너에 빈 등록 방법

  • @Configuration + @Bean 을 사용

  • 일반적으로 개발자가 직접 만든 클래스를 등록할떄는 @Service, @Repository를 사용

  • 외부 라이브러리나 프레임워크에서는 @Configuration + @Bean을 사용

  • @Component - 클래스를 컴포넌트로 간주하고 스프링 서버가 뜰 때 자동으로 감지, 위의 어노테이션 모두 컴포넌트 어노테이션을 포함함(컨트롤러, 서비스, 레포지토리 아닌 추가적인 클래스 등록할 때 종종 사용)

  • 스프링 빈 주입받는 방법

    • 생성자를 이용해 주입(권장 방식)

    • setter 사용

    • 필드에 직접 주입방식

 

JPA(Java Persistence API)

  • 문자열로 SQL을 작성하면 실수하기 쉽고, 실수를 늦게 발견하는 경우가 많음

  • 자바 진영의 ORM(Object-Relational Mapping)

  • Hibernate로 구현

  • Hibernate는 내부적으로 JDBC 사용

     

  • 저장: save 메소드를 이용해 새로운 객체를 데이터베이스에 저장

  • 조회: findAll 메소드로 모든 유저 데이터를 조회

  • 업데이트: findById를 사용해 특정 유저를 찾은 후, 업데이트를 진행

  • 삭제: delete 메소드를 이용하여 데이터를 삭제

  • 추가적인 쿼리 작성법: findBy, findAllBy, existsBy, countBy 등 다양한 접두사를 사용하여 복잡한 쿼리도 간단하게 작성할 수 있습니다. 조건 연산자(예: GreaterThan, LessThan 등)를 이용해 더 세밀한 쿼리도 가능

트랜잭션 개념

  • 트랜잭션 정의: 쪼갤 수 없는 업무의 최소 단위

  • 필요성: 여러 작업을 한 묶음으로 처리하여 모두 성공하거나 실패하게 하는 것

 

트랜잭션 필요 예시

  • 인터넷 쇼핑몰에서 주문, 포인트 적립, 구매 기록 저장 시 모든 과정이 함께 성공하거나 실패해야 함

 

트랜잭션 적용 방법

  • SQL 명령어: start transaction;commit; 또는 rollback;으로 처리

  • 코드 적용: @Transactional 어노테이션 사용

 

영속성 컨텍스트

  • 정의: Entity 객체를 관리/보관하는 역할

  • 특성: 트랜잭션 시작 시 생성되고 종료 시 소멸

 

영속성 컨텍스트 기능

  1. 변경 감지(Dirty Check): Entity의 변경 사항 자동 감지 및 저장

  2. 쓰기 지연: 트랜잭션 commit 시점에 모아둔 SQL을 한 번에 처리

  3. 1차 캐싱: 동일 ID 조회 시 최초 한 번만 SQL 실행, 이후 캐시 데이터 활용

트랜잭션 및 영속성 컨텍스트 적용 예

  • @Transactional 사용하여 UserService에 트랜잭션 적용

  • 조회 시 readOnly=true 옵션으로 최적화 가능

 


과제 제출


2주차 회고

  • 스프링 컨테이너에 대한 이해가 힘들었다. 스프링을 처음 사용한 건 아니라서 제어 역전, 의존성 주입등의 개념은 들어본적있지만 그것이 정확하게 어떤 개념인지 모르고 사용했었는데 강의를 통해서 조금이나마 이해된 것 같다. 스프링 컨테이너부분을 몇번씩 돌려본 것 같다.... 어렵다.. 이부분을 좀더 반복해서 들어야겠다. JPA도 역시 직접 sql 쿼리를 날려주는 것 보다 편한 것을 느꼈다. 간단하게 db에 접근이 가능했고 코드도 확실히 줄어들었음을 느꼈다. 트랜잭션에 대한 개념도 한번 다지기 좋았던 것같다. 영속성이란 부분에 대한 개념을 다시 생각해볼 수 있는 기회였다. 1주차에 비해 2주차는 조금 느슨해진감이 없지않아 있었다.... 3주차에는 불태울것이다! 2주차에 어려웠던 내용도 복습을 해야겠다.

댓글을 작성해보세요.

채널톡 아이콘