Spring이란?

아주 간략하게 설명을 하면, 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임 워크이다. 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로 부터 행해지는 매우 큰 규모의 환경을 엔터프라이즈 환경이라고 말함

Spring Framework는 경량 컨테이너로 자바 객체를 담고 직접 관리한다.

Spring의 특징

IoC와 AOP를 지원하는 경량의 컨테이너 프레임워크
Screen_Shot_2022-05-08_at_10.54.32_PM.png

POJO

→ Plain Old Java Object, 자바 객체라는 뜻

컨테이너란?

spring 컨테이너의 종류

→ 스프링 컨테이너는 <bean> 저장소에 해당하는 XML파일을 참조하여 bean의 생명주기를 관리하고 여러가지 서비스를 제공한다.

IOC(Inversion of Control) - 제어의 역전

→ 기존 사용자가 모든 작업을 제어하던 것을 특별한 객체에 모든 것을 위임하여 객체의 생성부터 생명 주기등 모든 객체에 대한 제어권이 언어간 것을 IOC, 즉 제어의 역전이라고 함

DL(Dependency Lookup) - 의존성 검색

DI(Dependency Injection) - 의존성 주입

의존성 주입하는 방식은 여러가지 방식이 있다.

XML을 통한 의존성 주입

  1. 생성자를 통한 의존성 주입
    1. 생성자에 인자로 주입하고자 하는 객체를 넣어준다.
    2. 스프링 설정 파일에서는 constructor-arg 태그과 ref속성을 이용
  2. 속성을 통한 의존성 주입
    1. 내부적으로 set method를 사용한다.
    2. 스프링 설정 파일에서는 property 태그를 사용해야 하며 name 속성값이 호출하고자 하는 메소드의 이름이어야한다.

어노테이션을 통한 의존성 주입

Annotation

Java Bean vs Spring Bean

AOP(Aspect Oriented Programming)

직역하면 관점지향프로그래밍이다.

DI가 의존성에 대한 주입이라면 AOP는 로직 주입이라고 할 수 있다.

→ 각 모듈을 구성하고 있는 코드는 핵심 관심사와 횡단 관심사가 합쳐진 것이다.

AOP의 목적

AOP는 중복을 제거해야 한다는 개발자의 숙명으로부터 탄생하게 된 것이다.

AOP를 이해 하는데 가장 중요한 핵심 개념은 바로 관심 분리(separation of Concerns)

1. XML을 이용한 AOP

2. 어노테이션을 이용한 AOP

PSA(Portable Service Abstaction)

일관성 있는 서비스 추상화

→ JDBC처럼 어댑터 패턴을 적용하여 같은 일을 하는 다수의 기술을 공통 인터페이스로 제어할 수 있게 한 것을 서비스 추상화라고 한다.

Screen_Shot_2022-05-09_at_10.22.06_AM.png
내부 Servlet, Java Class들의 동작 과정

  1. 웹 어플리케이션이 실행되면 Tomcat에 의해 web.xml이 loading됨
  2. web.xml에 등록되어있는 ContextLoaderListener(java class)가 생성됨. ContextLoaderListener 클래스는 ServletContextListener인터페이스를 구현하고 있으며 ApplicationContext를 생성하는 역할을 수행.
  3. 생성된 ContextLoaderListener는 root-context.xml을 loading한다.
  4. root-context.xml에 등록되어있는 Spring Conatainer가 구동된다. 이 때 개발자가 작성한 비즈니스 로직에 대한 부분과 DAO, VO 객체들이 생성된다.
  5. 클라이언트로부터 웹 어플리케이션이 요청 온다.
  6. DispatcherServlet(Servlet)이 생성된다. DispatcherServlet은 FrontController의 역할을 수행한다. 클라이언트로부터 요청온 메시지를 분석하여 알맞은 PageController에게 전달하고 응답을 받아 요청에 따른 응답을 어떻게 할지 결정만한다. 실질적인 작업은 PageController에서 이루어지기 때문이다. 이러한 클래스들을 HandlerMapping, ViewResolver 클래스라고 한다.
  7. DispatcherServlet은 servlet-context.xml을 loading한다.
  8. 두번째 Spring Container가 구동되며 응답에 맞는 PageController들이 동작한다. 이때 첫번 째 Spring Contatiner가 구동되면서 생긴 DAO, VO, Servicelmpl 클래스들과 협업하여 알맞은 작업을 처리하게 된다.

MVC

Screen_Shot_2022-05-09_at_10.36.24_AM.png
MVC(Model View Controller)

Model

model에서는 데이터 처리르 담당하는 부분이다.

모델 부분은 Service, Repository, Domain(Entity)으로 크게 구성이된다.

Model부분은 불필요하게 HTTP통신을 하지 말아야하며, request, response와 같은 객체를 매개변수로 받아선 안된다.

또한 Model부분의 Service는 view에 종속적인 코드가 없어야하고 View부분이 변경되더라도 Service부분은 그대로 재사용 할 수 있어야한다.

Model에서는 View와 Controller의 어떠한 정보를 가지고 있어선 안된다.

Image/BackEnd/Spring/Intro Spring/Untitled.png

Repository

public class MemoryMemberRepository implements MemberRepository {
    private static Map<Long, Member> store = new HashMap<>();
    //실무에서는 동시성 문제 때문에 공유되는 변수는 hashmap을 사용하지 않는다.
    private static long sequence = 0L;
    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }
    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
        //optional로 감싸면 값이 null이 와도 클라이언트에서 처리 가능
    }
    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }
    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }

    public void clearStore(){
        store.clear();
    }
}

DAO(Data Access Object)

Entity

package hello.hellospring.domain;

public class Member {

    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;
    }
}

DTO(Data Transfer Object)

!Untitled

이럴때 DTO를 사용한다.

@Data
    @AllArgsConstructor
    static class MemberDto {
        private String name;
        private Address address;
    }

Spring 프로젝트의 구조

Domain

@Entity
@Getter @Setter
public class Member {
    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;

Repository

@Repository
@RequiredArgsConstructor
public class MemberRepository{

    private final EntityManager em;

Service

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor 
public class MemberService {

    private final MemberRepository memberRepository;

Controller

@RestController // Response + Request
@RequiredArgsConstructor
public class MemberApiController {
    private final MemberService memberService;
    
    @GetMapping("api/v1/members")
    public Result<List<MemberDto>> memberV2() {

출처:

Spring 의 시작, 프레임워크의 구성요소와 동작원리

[Spring] Spring Framework란? 기본 개념 핵심 정리

스프링과 DAO, DTO, Repository, Entity


#Java #Spring_Java