본문 바로가기

Spring 공부

spring 공부 - 스프링부트, 계층

728x90
반응형

스프링부트

 

스프링은 장점이 많은 개발 도구지만 설정이 매우 복잡함
개발자가 조금 더 비즈니스 로직 개발에만 집중할 수 있도록 만들어주는 도구
톰캣, 제티, 언더토우 같은 웹 애플리케이션 서버 was 가 내장되어 있다.
빌드 구성 단순화하는 스프링 부트 스타터 제공
XML 설정 없이 자바 코드로 작성 가능
JAR 이용해서 자바 옵션만으로 배포 가능
애플리케이션 모니터링 및 관리 도구인 spring actuator 제공

 

IoC (Inversion of Control)

 

제어의 역전
외부에서 관리하는 객체를 가져와 사용한다.

 

public class A {
	private B b;
}

 

DI (Dependency Injection)

 

의존성 주입, 제어의 역전을 구현하기 위해 사용하는 방법
어떤 클래스가 다른 클래스에 의존한다는 뜻
@Autowired 애너테이션은 스프링 컨테이너에 있는 빈이라는 것을 주입한다.
스프링 컨테이너에서 객체를 주입받아 사용한다.

 

public class A
	@Autowired
    B b;
}

 

스프링 컨테이너

 

빈을 생성하고 관리함, 빈이 생성되고 소멸되기까지 생명주기를 이 스프링 컨테이너가 관리한다.
@Autowired와 같은 애너테이션을 사용해 DI를 지원한다.

 

 

스프링 컨테이너가 생성하고 관리하는 객체
여러가지 방법이 있음
@Component 애너테이션을 붙이면 빈으로 등록된다.

 

AOP

 

Aspect Oriented Programming
관점지향프로그래밍, 프로그램에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것
핵심 관점: 계좌이체, 고객관리
부가 관점: 로깅, 데이터베이스 연결
핵심 관점 코드에만 집중할 수 있게 될 뿐 아니라 프로그램의 변경과 확정에도 유연하게 대응할 수 있어 좋다.

 

PSA

 

이식 가능한 서비스 추상화
다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스
예를들어 데이터베이스 접근하기 위한 기술
JPA, MyBatis, JDBC -> 어떤 기술을 사용하든 일관된 방식으로 데이터베이스 접근
WAS에서 톰캣, 언더토우, 네티와 같은 다른 곳에서 실행해도 기존코드 그대로 사용할 수 있다.
추상화된 다양한 서비스들을 일관된 방식으로 사용할 수 있다.


IoC: 객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임워크가 대신하는 것
DI: 외부에서 객체를 주입받아 사용하는 것
AOP: 프로그래밍을 할 때 핵심 관점과 부가 관점을 나누어 개발하는 것
PSA: 어느 기술을 사용하던 일관된 방식으로 처리하는 것

 

 

메인

 

@SpringBootApplication
public class SpringBootDeveloperApplication{
	public static void main(String[] args) {
    	SpringApplication.run(SpringBootDeveloperApplication.class, args);
    }
}

 

main 메서드와 같은 역할, 여기서 스프링 부트가 시작된다.
@SpringBootApplication : 스프링 부트 사용에 필요한 기본 설정
SpringApplication.run : 애플리케이션 실행
(SpringBootDeveloperApplication.class, args) : 메인 클래스로 사용할 클래스, 커맨드라인의 인수 전달

 

@SpringBootApplication 구성

 

@SpringBootConfiguration : 스프링 부트 관련 설정
@ComponentScan : 사용자가 등록한 빈을 읽고 등록함, @Component라는 애너테이션 가진 클래스들
@EnableAutoConfiguration : 스프링부트에서 자동 구성을 활성화

 

 

테스트 컨트롤러

@RestController
public class TestController{
	@GetMapping("/test");  // test GET요청이 들어오면 test()메서드 실행
	public String test() {
    	return "Hello, world!";
    }
}

 

 

@RestController : 라우터역할, HTTP 요청과 메서드를 연결하는 장치

 


 

@Configuration : 설정 파일 등록
@Repository : ORM 매핑
@Controller, @RestController : 라우터
@Service : 비즈니스 로직

-> @Controller, @Configuration, @Repository, @Service 애너테이션에서 @Component 애너테이션을 갖고 있다.

 


스프링부트 구조

 

각 계층이 양 옆의 계층과 통신하는 구조
계층: 각자의 역할과 책임이 있는 소프트웨어의 구성 요소, 다른 계층에 직접 간섭하거나 영향을 미치지 않는다.

 

 

프레젠테이션 계층

 

HTTP 요청을 받고 비즈니스 계층으로 전송하는 역할 : 컨트롤러

 

비즈니스 계층

 

모든 비즈니스 로직을 처리한다. 서비스를 만들기 위한 로직
웹사이트에서 벌어지는 모든 작업, 주문 서비스라고 한다면 주문 개수, 가격 등의 데이터 처리하기 위한 로직, 예외 처리 로직, 주문 받거나 취소하는 프로세스 : 서비스

 

퍼시스턴스 계층

 

보든 데이터베이스 관련 로직 처리, DAO 객체 사용, 데이터베이스 계층과 상호작용하기 위한객체 : 레포지토리

 

 

Conroller

@RestController
public class TestController {

  @Autowired
  TestService testService;

  @GetMapping("/test")
  public List<Member> getAllMembers() {
    List<Member> members = testService.getAllMembers();
    return members;
  }
}

 

@RestController: RESTful 웹 서비스의 컨트롤러. 이 클래스의 모든 메소드는 HTTP 응답 본문에 직접 데이터를 쓸 수 있다. 기존의 @Controller 어노테이션과 @ResponseBody 어노테이션을 결합한 것과 같은 역할

 

@Autowired: 이 어노테이션은 필드나 메소드나 생성자를 통해 의존성 주입(Dependency Injection)을 수행한다. 여기서는 TestService를 주입받는다.

 

TestService testService: TestService 클래스의 인스턴스를 주입받는다.

 

@GetMapping("/test"): 이 어노테이션은 HTTP GET 요청을 처리하는 핸들러, /test 경로로 요청이 오면 이 메소드가 처리한다.

 

public List<Member> getAllMembers(): 이 메소드는 모든 회원 정보를 가져오는 메소드. testService.getAllMembers()를 호출하여 모든 회원 정보를 가져온다.

 

return members;: 회원 정보를 담은 리스트를 반환. 이 값은 Spring MVC에 의해 JSON 형식으로 직렬화되어 클라이언트에게 응답된다.

 

 

Service

 

@Service
public class TestService {
  @Autowired
  MemberRepository memberRepository;

  public List<Member> getAllMembers() {
    return memberRepository.findAll();
  }
}

 

@Service: 이 어노테이션은 해당 클래스가 서비스 계층의 구성 요소임을 나타냄. 주로 비즈니스 로직을 처리하고 데이터 액세스 객체(DAO)와 통신하는 역할

 

@Autowired: 이 어노테이션은 필드나 메소드나 생성자를 통해 의존성 주입(Dependency Injection)을 수행합니다. 여기서는 MemberRepository를 주입받습니다.

 

MemberRepository memberRepository: MemberRepository 인터페이스의 구현체를 주입받는 필드. 이를 통해 데이터베이스와의 상호작용을 담당하는 메소드를 호출할 수 있다.

 

public List<Member> getAllMembers(): 이 메소드는 모든 회원 정보를 가져오는 메소드. memberRepository.findAll()을 호출하여 모든 회원 정보를 조회한다.

 

 

DAO

 

@NoArgsConstructor(access = AccessLevel.PROTECTED) // 접근제한자가 protected인  기본 생성자
@AllArgsConstructor
@Getter
@Entity // 엔터티로 지정
public class Member {
  @Id // id 필드를 기본키로 지정
  @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본키를 자동으로 1씩 증가
  @Column(name = "id", updatable = false) // @Column 컬럼과 필드 매핑ㅍ
  private Long id;
  @Column(name = "name", nullable = false) // name이라는 not null 컬럼과 매칭
  private String name;
}

 

JPA 엔터티인 Member 클래스. 이 클래스는 데이터베이스의 테이블과 매핑되며, 회원 정보를 나타낸다.

 

@NoArgsConstructor(access = AccessLevel.PROTECTED): 이 어노테이션은 매개변수가 없는 생성자를 자동으로 생성. 생성자의 접근 제한자를 protected로 설정하여 외부에서 직접 호출할 수 없도록 한다.

 

@AllArgsConstructor: 이 어노테이션은 모든 필드를 매개변수로 받는 생성자를 자동으로 생성.

 

@Getter: 이 어노테이션은 모든 필드에 대한 getter 메소드를 자동으로 생성

 

@Entity: 이 어노테이션은 해당 클래스가 JPA 엔터티.

 

@Id: 이 어노테이션은 해당 필드를 엔터티의 기본키(primary key)로 지정

 

@GeneratedValue(strategy = GenerationType.IDENTITY): 이 어노테이션은 기본키를 자동으로 생성하는 전략을 설정. 여기서는 데이터베이스가 기본키를 자동으로 생성하도록 IDENTITY 전략을 사용. (AUTO_INCREMENT)

 

@Column(name = "id", updatable = false): 이 어노테이션은 해당 필드를 데이터베이스의 열과 매핑. 여기서는 id라는 이름의 컬럼과 매핑하며, 해당 컬럼은 업데이트되지 않도록 updatable = false로 설정.

 

@Column(name = "name", nullable = false): 이 어노테이션은 해당 필드를 데이터베이스의 열과 매핑. 여기서는 name이라는 이름의 컬럼과 매핑하며, 해당 컬럼은 NOT NULL 제약조건을 가지도록 nullable = false로 설정함

 

 

Repository

@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
   
}

 

Spring Data JPA에서 사용되는 Member 엔티티에 대한 데이터 액세스를 위한 리포지토리 인터페이스

 

@Repository: 이 어노테이션은 해당 인터페이스가 데이터 액세스 계층의 구성 요소. 스프링 컴포넌트 스캔이 이 인터페이스를 발견하면 이를 스프링 Bean으로 등록한다.

 

MemberRepository: 이 인터페이스는 Spring Data JPA의 JpaRepository 인터페이스를 확장(상속)한다. JpaRepository는 Spring Data JPA에서 제공하는 공통 인터페이스로, 엔티티의 CRUD(Create, Read, Update, Delete) 작업을 위한 메서드를 제공한다.

 

JpaRepository<Member, Long>: JpaRepository의 제네릭 타입에는 엔티티 클래스(Member)와 엔티티의 기본 키 타입(Long)을 지정. 이를 통해 해당 리포지토리는 Member 엔티티와 관련된 CRUD 작업을 수행할 수 있다.

 

 

 

반응형