본문 바로가기
Back-End/Spring

TIL 230619 : Spring은 그저 도구. (IoC/DI, 3 Layer, 영속성 컨텍스트(flush commit 차이), 클래스 리터럴, URL주의점..

by 우인입니다 2023. 6. 20.
강의를 집중해서 듣는 기간에는 새로운 정보들이 홍수처럼 쏟아진다.
새롭게 배운 내용, 배우면서 심화하고 싶은 내용, 어렵진 않아도 복잡한 내용 등.
이 기간에만 다양한 내용들을 포스팅에 정리하며 체득하고자 한다.

처음 배운 개념들

3 Layer Architecture

패턴이 보이니까 개발자 조상님들이 나눠놓음.

Controller : 프론트엔드에서 받은 http요청들이 한 눈에 보기 쉽다. 데이터를 넘겨받는 방법들이 몇가지 있다.

Service : 거의 주요하게 개발될 파트. 실제 서비스 관련된 로직들이 담긴다.

Repository : DB와 연동되는 로직들. Spring Data JPA를 통해 편리하게 이용이 가능하다.

 

 

Spring Data JPA

사용방법이 조금 독특하다.

해당 Repository클래스를 인터페이스로 바꾸고 JpaRepository를 해당 지네릭스와 함께 상속시켜주면 된다.

Spring 서버가 뜰 때 자동으로 스캔하여 SimpleJpaRepository 클래스를 자동으로 생성하고 Bean으로 등록한다.

솔직히 뭔말인지 모르겠다. 그런가보다하고 우선 넘어간다.

 

 

QueryMothods

Spring Data JPA에서 제공하는 기능이다.

메소드 이름만 잘 지으면 알아서 기능을 구현해준다.

괜히 프레임워크 쓰는 게 아니구나 싶기도 하며, 얼마나 많은 기능들이 숨어있는 지 궁금하기도 하다.

쓰는 방법은 구글에 많이 나오므로 생략..

 

 

IoC DI

 

DI : 의존성 주입

의존성 : 하나 코드를 바꾸면 다른 클래스에서도 코드 수정을 해야한다? 의존성이 있다~

의존성 주입 : 코드를 어떻게 짜느냐에 따라 코드를 어떻게 바꿔야할지 다르다. 몇가지 방법으로 의존성을 주입할 수 있다.

   - 생성자 주입, 필드주입, 메서드 주입

   - 매서드 주입 방법은  final 멤버도 초기화 할 수 있어서 객체의 불변성을 지켜주기 용이하다.

   - 현업에서는 대부분 생성자 주입. Lombok으로도 가능

IoC : 제어의 역전

 

한줄요약 : DI를 통해 IoC를 이뤄냄.

+ @RequiredArgsConstructor (final 멤버를 생성자의 멤버로 가져간다.)

 

 

 

 

 

 

 

 

 

영속성 컨텍스트

트랜잭션 느낌으로 쓰는것. 트랜잭션은 기능이름이 아니라 논리적 개념이다.

entity관리하고 쿼리를 효율적으로 보내기 용이하다.

예를 들어, id :1 데이터를 삭제하고 싶을 때, 바로 삭제쿼리를 DB에 날리는 것이 아니라,

Removed 상태로 바꾸고, 최종적으로 Remove가 취소가 안된다면 마지막에 DB로 삭제 쿼리를 날린다.

 

@Transaction 을 달아서 영속성 컨텍스트 작업환경임을 명시해야한다.

 

장바구니에 우리가 메뉴를 고민하며 이거저거 수정하다 삭제도하고 다시 추가도 하다 한번에 주문 보내는 게 효율적인 주문 방법인 것과 비슷하려나 싶다.

 

 

 

flush commit 차이

commit에 flush가 포함되어 있다.

commit이 실행되면 flush가 된 이후 트랜잭션이 종료된다. 그래서 Rollback할 수 없고,

flush는 실행된 이후에도 트랜잭션 환경을 이어갈 수 있다.

 

참고

https://velog.io/@tomato2532/JPA-JPA-Entity-2-영속성-컨텍스트Persistence-Context

https://ocwokocw.tistory.com/122

 

 

 

 

 

 

예민한 URL

틀린 그림 찾기

이것 때문에 20분 잡혔다. / 가 있고 없고의 차이를 느꼈다. 마침표처럼 쓰는 게 아니다. 하위경로의 시작을 알리는 거라고 생각하자.

 

 

 

 

좀 더 공부해야 할 내용

IoC Bean

Bean이라는 개념이 아직은 와닿지않고 그냥 스프링에서 미리 세팅해주는 객체느낌정도로 이해하고 우선 유보하려한다.

 

+ autowired는 생성자가 하나일때 생략 가능.

 

@Component로 빈 객체 등록 가능.

@Service, @Repository, @Controller, @RestController 등으로 세분화해서 빈 객체로도 등록가능.

 

 

 

Optional 타입

findById는 반환 값이 Optional 래퍼클래스인데, 이는 null값을 포함해주기에 NPE (Null Pointer Exception) 을 발생시키지 않는다고 한다. 이 외에도 다양한 메소드가 존재하는 것 같고, 예외 처리하는 방법 등이 있는 듯하다.

 

 

클래스리터럴

처음 본 문법. .class라니..?

강의도중 aaa.class Memo.class와 같이 뒤에 .class로 나온 형식이 있었다.

찾아보니 클래스리터럴이라는 개념이었다.

클래스라는 틀을 정의할 클래스가 필요한데 이에 대한 정보가 담겨있는 정도로 이해했다.

 

참고

https://aidencom.tistory.com/m/846

https://devyongsik.tistory.com/292

 

 

@PathVariable vs @RequestParam vs @RequestBody

각각의 장단점이 있고, 특성에 맞게 활용이 필요해 보인다.

PathVariable : 정렬, 검색, 필터링에 용이하다.

RequestParam : 받아야 할 데이터의 종류가 적을 때 적절하다.

RequestBody : Body에 데이터가 오기에 URL에 보이지 않는다. JSON 혹은 객체형태로 받기 좋다.

이 정도의 지식은 표면적으로 알 수는 있었지만 깊이 있는 노하우는 감이 오질 않는다.