[TIL] 2024-08-09

성장일기·2024년 8월 15일

회고

목록 보기
26/37
post-thumbnail

중요 학습 내용 [Spring]

Spring

spring vs spring boot

  • spring(legacy)
    • war → tomcat에 직접 올려야한다.
  • spring boot
    • 비즈니스로직을 짜는데에만 집중하기 위함.
    • jar를 말아 직접 tomcat에 올려야한다.
    • 내장톰캣(tomcat 설정 불필요)

IoC/DI & AOP & PSA

  • IoC(Inversion of Control) & DI(Dependency Injection
    • IoC: 제어권 역전으로, Spring이 bean으로 객체를 관리하여, 개발자는 관리가 잘될 수 있도록 setting만 잘하면 된다. 제어권이 개발자가 아닌 Spring의 IoC Container가 된다.
    • DI: 의존성 주입으로, bean들 간에 필요시 의존성을 주입해준다.
  • AOP(Aspect Oriented Programing: oop + aspect
  • PSA(Portable Service Abstraction): 인터페이스를 넣어 추상화를 통해 유지보수를 용이하게한다. 동적바인딩으로 DIP(Dependency Inversion Principle. 의존성 역전)를 이용하여 클래스가 간접적인 인터페이스를 의존하여 EJB의 결합도를 낮춘다.
    • uses: @Transcational, @SpringWebMVC
      • @SpringWebMVC의 경우 @Controller에서 Servlet을 생성하지 않아도, DispacherServlet이 알아서 request를 doGet, doPost로 받아 비즈니스상의 메소드를 호출한다.

Bean Settings

  • IoC Container에 bean을 등록하고, 개발자가 조회(DI에 활용)할 수 있다.

1. POJOs

  • bean 등록: 스프링에서 기본적으로 pojo 객체를 싱글톤으로 생성
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ContextConfiguration {

    @Bean(name="member")
    public MemberDTO getMember() {
        return new MemberDTO(1, "user01", "pass01", "홍길동");
    }
}
  • bean 활용
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(ContextConfiguration.class);

        // 설명. bean 목록 조회
        String[] beanNames = context.getBeanDefinitionNames();
        for (String beanName : beanNames) {
            System.out.println("beanName: " + beanName);
        }

        // 설명. 1. bean의 id(bean의 이름)를 이용해서 bean을 가져오는 방법
        MemberDTO member = (MemberDTO) context.getBean("member");

        // 설명. 2. bean의 클래스 메타 정보(bean의 타입)을 전달하여 가져오는 방법
        MemberDTO member = context.getBean(MemberDTO.class);

        // 설명. 3. bean의 id와 클래스 메타 정보를 전달하여 가져오는 방법
        MemberDTO member = context.getBean("member", MemberDTO.class);

        System.out.println("member: " + member);

    }
}

2. XML

Documentation

  • .xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="member2" class=".. .MemberDTO">
        <constructor-arg index="0" value="2"/>
        <constructor-arg name="id" value="user02"/>
        <constructor-arg index="2"><value>pass01</value></constructor-arg>
        <constructor-arg name="name"><value>홍길동</value></constructor-arg>
    </bean>

</beans>
  • .java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new GenericXmlApplicationContext("section02/xmlconfig/spring-context.xml");
        MemberDTO member2 = (MemberDTO) context.getBean("member2");
        System.out.println("Member2: " + member2);
    }

3. Annotation

  • MVC annotations: Layered Architecture에 맞춰 MVC 패턴의 bean을 만들어주는 annotation
    • @Controller:
    • @Service:
    • @Repository: DB에서 에러 발생시 java Exception으로 바꿔준다.
  • XML에서 component-scan scope를 지정하여 mvc annotation 방식을 통해 등록 가능

[ContextConfiguration.java]

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration("configurationSection03") // configuration id
@ComponentScan(basePackages = "component scan scope with file path")
public class ContextConfiguration {
}

[MemberDAO.java]

@Repository
public class MemberDAO {
    private final Map<Integer, MemberDTO> memberMap;

    public MemberDAO() {
        memberMap = new HashMap<>();

        memberMap.put(1, new MemberDTO(1, "user01", "pass01", "홍길동"));
        memberMap.put(2, new MemberDTO(2, "user02", "pass02", "유관순"));
    }

    // 설명. 회원 조회용 메소드
    public MemberDTO selectMember(int sequence) {
        return memberMap.get(sequence);
    }

    // 설명. 회원 가입용 메소드
    public int insertMember(MemberDTO registMember) {
        int before = memberMap.size();
        memberMap.put(registMember.getSequence(), registMember);

        int after = memberMap.size();

        return after-before;
    }
}

Bean access

  • Ready 상태의 IoC Container에 등록된 bean에 접근할 수 있다.
  1. bean의 id(bean의 이름)를 이용해서 bean을 가져오는 방법
  2. bean의 클래스 메타 정보(bean의 타입)을 전달하여 가져오는 방법
  3. bean의 id와 클래스 메타 정보를 전달하여 가져오는 방법
profile
엔지니어로의 성장일지

0개의 댓글