[인프런 워밍업 클럽 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 객체를 관리/보관하는 역할
특성: 트랜잭션 시작 시 생성되고 종료 시 소멸
영속성 컨텍스트 기능
변경 감지(Dirty Check): Entity의 변경 사항 자동 감지 및 저장
쓰기 지연: 트랜잭션 commit 시점에 모아둔 SQL을 한 번에 처리
1차 캐싱: 동일 ID 조회 시 최초 한 번만 SQL 실행, 이후 캐시 데이터 활용
트랜잭션 및 영속성 컨텍스트 적용 예
@Transactional
사용하여 UserService에 트랜잭션 적용조회 시
readOnly=true
옵션으로 최적화 가능
과제 제출
2주차 회고
스프링 컨테이너에 대한 이해가 힘들었다. 스프링을 처음 사용한 건 아니라서 제어 역전, 의존성 주입등의 개념은 들어본적있지만 그것이 정확하게 어떤 개념인지 모르고 사용했었는데 강의를 통해서 조금이나마 이해된 것 같다. 스프링 컨테이너부분을 몇번씩 돌려본 것 같다.... 어렵다.. 이부분을 좀더 반복해서 들어야겠다. JPA도 역시 직접 sql 쿼리를 날려주는 것 보다 편한 것을 느꼈다. 간단하게 db에 접근이 가능했고 코드도 확실히 줄어들었음을 느꼈다. 트랜잭션에 대한 개념도 한번 다지기 좋았던 것같다. 영속성이란 부분에 대한 개념을 다시 생각해볼 수 있는 기회였다. 1주차에 비해 2주차는 조금 느슨해진감이 없지않아 있었다.... 3주차에는 불태울것이다! 2주차에 어려웠던 내용도 복습을 해야겠다.
댓글을 작성해보세요.