[EC-Spring] 3주차-DI, IoC, POJO
DI [Dependency Injection] (의존성 주입)
IoC [Inversion of Controll] (제어의 역전)
POJO [Plain Old Java Object] (오래된 방식의 단순 자바 객체)
IoC는 스프링 프레임워크의 심장부
IoC 컨테이너는 POJO를 구성하고 관리
스프링 프레임워크의 가장 중요한 의의는 POJO로 자바 애플리케에션을 개발하는 것
스프링의 주요 기능은 대부분 IoC 컨테이너 안에서 POJO를 구성 및 관리하는 일과 관련
어떤 종류의 프로젝트에 스프링 프레임워크를 활용하더라도 첫 단추는 POJO와 IoC 컨테이너를 다루는 기술
'빈(bean)'과 'POJO 인스턴스'는 자바 클래스로 생성한 객체 인스턴스
'컴포넌트(component)'와 'POJO 클래스'는 객체 인스턴스를 생성하는 데 필요한 실제 자바 클래스
POJO 클래스 설계
@Configuration, @Bean을 붙인 자바 구성 클래스를 만들거나,
@Component, @Repository, @Service, @Controller 등을 붙인 자바 컴포넌트를 구성
IoC 컨테이너는 에너테이션을 붙인 자바 클래스를 스캐닝scanning(탐색)하여 애플리케이션의 일부인 것처럼 POJO 인스턴스/빈을 구성
예제
@Configuration, @Bean을 붙인 자바 구성 클래스를 생성
build.gradle
plugins {
id 'org.springframework.boot' version '2.6.6'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'org.ec'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
SequenceGenerator.java
package org.ec.springcore.sequence;
import java.util.concurrent.atomic.AtomicInteger;
public class SequenceGenerator {
private String prefix;
private String suffix;
private int initial;
private final AtomicInteger counter = new AtomicInteger();
public SequenceGenerator() {
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public void setInitial(int initial) {
this.initial = initial;
}
public String getSequence() {
StringBuilder builder = new StringBuilder();
builder
.append(prefix)
.append(initial)
.append(counter.getAndIncrement())
.append(suffix)
;
return builder.toString();
}
}
SequenceGeneratorConfig.java
package org.ec.springcore.sequence.config;
import org.ec.springcore.sequence.SequenceGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SequenceGeneratorConfig {
@Bean
public SequenceGenerator sequenceGenerator() {
SequenceGenerator sequenceGenerator = new SequenceGenerator();
sequenceGenerator.setPrefix("30");
sequenceGenerator.setSuffix("A");
sequenceGenerator.setInitial(100000);
return sequenceGenerator;
}
}
SpringcoreApplication.java
package org.ec.springcore;
import org.ec.springcore.sequence.SequenceGenerator;
import org.ec.springcore.sequence.config.SequenceGeneratorConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringcoreApplication {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(SequenceGeneratorConfig.class);
SequenceGenerator generator = context.getBean(SequenceGenerator.class);
System.out.println(generator.getSequence());
System.out.println(generator.getSequence());
}
}
301000000A
301000001A
@Component 등을 붙인 자바 컴포넌트를 구성
Sequence.java
package org.ec.springcore.sequence;
public class Sequence {
private final String id;
private final String prefix;
private final String suffix;
public Sequence(String id, String prefix, String suffix) {
this.id = id;
this.prefix = prefix;
this.suffix = suffix;
}
public String getId() {
return id;
}
public String getPrefix() {
return prefix;
}
public String getSuffix() {
return suffix;
}
}
SequenceDao.java
package org.ec.springcore.sequence.dao;
import org.ec.springcore.sequence.Sequence;
public interface SequenceDao {
Sequence getSequence(String sequenceId);
int getNextValue(String sequenceId);
}
SequenceDaoImpl.java
package org.ec.springcore.sequence.dao.impl;
import org.ec.springcore.sequence.Sequence;
import org.ec.springcore.sequence.dao.SequenceDao;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
@Component("sequenceDao")
public class SequenceDaoImpl implements SequenceDao {
private final Map<String, Sequence> sequences = new HashMap<>();
private final Map<String, AtomicInteger> values = new HashMap<>();
public SequenceDaoImpl() {
sequences.put("IT", new Sequence("IT", "30", "A"));
values.put("IT", new AtomicInteger(10000));
}
public Sequence getSequence(String sequenceId) {
return sequences.get(sequenceId);
}
public int getNextValue(String sequenceId) {
AtomicInteger value = values.get(sequenceId);
return value.getAndIncrement();
}
}
SequenceGeneratorConfig.java
package org.ec.springcore.sequence.config;
import org.ec.springcore.sequence.SequenceGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
@Configuration
@ComponentScan(
basePackages = "org.ec.springcore.sequence",
includeFilters = {
@ComponentScan.Filter(
type = FilterType.REGEX,
pattern = {"org.ec.springcore.sequence.dao.*Dao"})
},
excludeFilters = {
@ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = {org.springframework.stereotype.Controller.class}) }
)
public class SequenceGeneratorConfig {
@Bean
public SequenceGenerator sequenceGenerator() {
SequenceGenerator sequenceGenerator = new SequenceGenerator();
sequenceGenerator.setPrefix("30");
sequenceGenerator.setSuffix("A");
sequenceGenerator.setInitial(100000);
return sequenceGenerator;
}
}
package org.ec.springcore;
import org.ec.springcore.sequence.SequenceGenerator;
import org.ec.springcore.sequence.config.SequenceGeneratorConfig;
import org.ec.springcore.sequence.dao.SequenceDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringcoreApplication {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(SequenceGeneratorConfig.class);
SequenceDao sequenceDao = context.getBean(SequenceDao.class);
System.out.println(sequenceDao.getNextValue("IT"));
System.out.println(sequenceDao.getNextValue("IT"));
}
}
출처
Author And Source
이 문제에 관하여([EC-Spring] 3주차-DI, IoC, POJO), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@umtuk/EC-Spring-3주차-DI-IoC-POJO저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)