본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2024-2 Spring Boot 스터디] 김문기 #2주

반응형

생성자 주입(DI)

우리가 이전 시간에 만들었던 Controller, Service, Repository 객체들을 스프링에서 사용하기 위해서는 스프링 빈에 등록해 주어야 한다.

우선 각 코드들이 정확히 무슨 기능을 하는 지 설명하자면

  • Controller : 화면(View)과 비즈니스 로직(Model)를 연결시키는 다리 역할을 한다. 쉽게 말해서 주소 매핑을 해주는 기능을 한다고 생각하면 된다.
  • Service: Controller에서 요청을 받아 비즈니스 로직을 수행하여 실행하거나 값을 리턴하는 역할을 수행 한다.
    # Controller가 주문을 받으면 Service가 음료를 제작하는 느낌이다.
  • Repository: 이 객체는 이름 그대로S DB에 접근이 가능 한 객체라고 생각하면 편하다.

우리가 만든 이 객체들을 스프링에서 사용 하기 위해서는 스프링 컨테이너에 Bean으로 등록을 해주어야 하는데 이때 사용하는것이 @Controller, @Service, @Repository 어노테이션이다.

 

스프링 컨테이너에 등록하게 되면 이 객체들은 싱글톤으로 관리가 되는데 이 객체들을 서로 연결하기 위해서 사용 되는 것이 @AutoWired 어노테이션 이다.

 

예를들어

package hello.hellospring.controller;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberController {
 	private final MemberService memberService;
 		@Autowired
		 public MemberController(MemberService memberService) {
 		this.memberService = memberService;
		 }
	}

이런 식으로 생성자에 @AutoWired를 달아주면 스프링이 관련된 객체를 스프링 컨테이너에서 찾아서 넣어주는데 이것을 의존성 주입(DI) 이라고 한다.

    => 의존성 주입에는 이처럼 생성자를 통해 주입 하는 방법을 생성자 주입이라고 하는데 이 외에도 setter메소드 를 통해 주입하는 수정자         주입, 필드에 직접 주입하는 field주입 방식 등 여러가지 의존성 주입 방법들이 있다.

 

Tip: 만약 생성자가 하나만 있는 경우는 @Autowired를 붙혀주지 않아도 스프링이 자동으로 의존성 주입을 해준다.

Tip2: 만약 연결해줘야 하는 객체들이 많은 경우 일일이 Autowired를 생성자에 붙혀주는 것은 너무 귀찮다. 이걸 쉽게 해주는 것이 Lombok의 @RequiredArgsConstructor 어노테이션이다. @RequiredArgsConstructor 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 어노테이션 이다. 이를 사용하면 아래처럼 간단히 의존성 주입을 해줄 수 있다.

package hello.hellospring.controller;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
@RequiredArgsConstructor
public class MemberController {
 	private final MemberService memberService;	
}

 

 

이러한 어노테이션 들을 활용해서 의존관계를 설정하는 방법을 컴포넌트 스캔 방식이라고 한다.

 

이와는 다르게 상황에 따라 구현 클래스를 변경해야 하는 경우가 있기도 하는데 이럴 때 하용하는 것이 @Configuration 어노테이션 이다.

이 어노테이션을 사용하면 자바 코드로 직접 스프링 빈에 객체를 등록할 수 있다.

@Configuration
public class SpringConfig {
 	@Bean
	 public MemberService memberService() {
 		return new MemberService(memberRepository());
	 }
 	@Bean
 	public MemberRepository memberRepository() {
		return new MemoryMemberRepository();
 	}
}

 

 

 

 

DB접근 기술

지금까지 우리는 단순히 Map 객체를 사용하여 데이터를 저장하는데 사용했다. 그치만 이러게 되면 프로그램을 종료함과 동시에 데이터가 사라지게 된다. 이를 막기 위해 우리는 실제 DataBase를 연결시켜줘야 하는데 그러한 과정을 쉽게 해주는 것이 바로 JPA 이다.

JPA를 사용하려면 Entity 매핑을 해주어야 한다.

@Entity
 public class Member {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Long id;
 private String name;
 public Long getId() {
 	return id;
    }
 public void setId(Long id) {
 	this.id = id;
    }
 public String getName() {
 	 return name;
    }
 public void setName(String name) {
 	this.name = name;
    }
 }

 

그리고 또한 서비스 계층에 @Transactional 어노테이션을 추가해 주어야 한다.

 import org.springframework.transaction.annotation.Transactional
 @Transactional
 public class MemberService {}

 

여기서 트랜잭션이란 뭘까?

트랜잭션이란 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위를 의미한다.

 

그래서  @Transactional 사용하는 이유는 뭘까?

@Transactional 어노테이션을 붙혀주게 되면 Dirty checking을 하게 되고 데이터 베이스에 commit을 해서 수정된 사항을 save 없이도 반영 할 수 있게 된다. 이때 Dirty Checking이란 쉽게 말해서 상태 변경 검사를 말한다. dirty checking은 트랜잭션 안에서 엔티티의 변경이 일어나면 변경 내용을 자동으로 데이터 베이스에 반영하는 JPA의 특징이다.

반응형