pom.xml에 의존성 설정하면 자동으로 지정된 의존성에 맞는 환경을 설정해줌
maven + starter
비웹 어플리케이션
일반적인 Java SE 환경 : jar
Spring Framework 환경 : jar
Spring Boot 환경 : jar
웹 어플리케이션
기본 Servlet/JSP 환경 : war
Spring Framework 환경 : war
Spring Boot 환경 : jar/war (톰캣이 내장되어 있어서 jar를 실행 가능)
jar 실행 : java -jar 파일명.jar
: src/main/resources의 application.properties (application.yml 야물) 이용해서 전반적인 환경 설정을 함
- application.properties
server.error.whitelabel.enabled=false
server.port=8090
server:
error:
whitelabel:
enabled: false
port: 8090
둘이 형식이 다르다
https://docs.spring.io/spring-boot/docs/2.7.18/reference/htmlsingle/#using.build-systems.starters
http://mvnrepository.com에서 starter 사용 가능
@SpringBootApplication
public class Application {
// 필수
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
https://docs.spring.io/spring-boot/docs/2.7.18/reference/htmlsingle/#features.logging
log4J 라이브러리 (framework)
logback 라이브러리 (boot 기본 로깅 담당)
로깅 처리 구조
SLF4J (인터페이스, 스펙) - log()
|
| 구현
|
log4J logback
trace
debug
info (기본)
warn
error
=> application.properties에 로깅 레벨을 설정
=> 동작 방식은 지정된 레벨 포함한 하위 레벨까지 로깅 처리됨
spring-boot-starter의 서브로
spring-boot-starter-logging이 담당
log4J
logback
slf4j
로깅레벨
logging.level.org.springframework=debug
logging.level.com.exam=info
파일에 저장1 (경로지정만 함)
logging.file.path=c://log ( spring.log 파일이 생성됨 )
파일에 저장2 (경로지정 + 파일명 같이 지정)
logging.file.name=c:\temp\test2.log
application.properties
logging.level.com.exam=trace
java
Logger logger = LoggerFactory.getLogger(getClass());
로그 출력
logger.trace("trace:{},{}", "trace1","trace2");
logger.debug("debug:{}", "debug");
logger.info("info:{}", "info");
logger.warn("warn:{}", "warn");
logger.error("error:{}", "error");
@SpringBootApplication (scanBasePackages = {"com.exam2"})
public class Application { }
@SpringBootApplication( , , @ComponentScan)
Application.java
xxx
// @Bean으로 빈 생성시 빈 정보를 설정하는 빈에서 사용
@Configuration (빈으로 생성됨)
Test.java
// 범용적으로 사용
@Component
Hello.java
// DAO 역할의 빈에서 사용
@Repository
World.java
// Service 역할의 빈에서 사용
@Service
World2.java
// @RestController
@Controller
World3.java
DeptSevice
@Service @Repository
DeptServiceImpl -------------> DeptDAO
// @Repository 만들어주고 생성자에 파라미터로 넣어주면 의존성 주입이 됨
DeptDAO dao;
public DeptServiceImpl(DeptDAO dao) {
this.dao = dao;
}
DeptDAO dao;
// 생성자
public DeptServiceImpl(DeptDAO dao){
this.dao = dao;
}
@Autowired
DeptDAO deptDAO;
@Repository("empDAO")
@Primary
public class EmpDAO
// 생성자 주입 이용
public DeptServiceImpl(@Qualifier("deptDAO") CommonDAO commonDAO) {}
// @Autowired 이용
@Autowired
@Qualifier("empDAO")
CommonDAO commonDAO;
5) 명시적 설정 방법
은 skip. 거의 안 쓴다
: MVC 환경에서는 쓸 일 거의 없음. SE 환경에서 사용
// IoC Container 얻기 (얘도 빈)
ApplicationContext ctx;
public 생성자 (ApplicationContext ctx) {
this.ctx = ctx;
}
또는
@Autowired
ApplicationContext ctx;
ctx.getBean("xxx", 클래스명.class); // @Service("xxx") public class DeptServiceImpl
DeptServiceImpl s = ctx.getBean("xxx", DeptServiceImpl.class);
DeptServiceImpl s2 = ctx.getBean("xxx", DeptServiceImpl.class);
@Scope(value=상수값)
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Scope("prototype")
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) // 기본
@Scope("singleton")
singleton (기본, 단 하나의 빈으로 서비스, thread-unsafe)
prototype (getBean 할 때마다 매번 생성해서 서비스, thread-safe)
request (web 사용 가능. 요청~응답 사이에서만 사용 가능)
session (web 사용 가능. 기본적으로 web 브라우저가 open 되어있는 동안 사용 가능)
application (web 사용 가능. 기본적으로 Tomcat 컨테이너가 start 되어있는 동안 사용 가능)
예>
@PostConstruct
public void init() {
// 초기화 작업
}
@PreDestroy
public void clean() {
// cleanup 작업
}
여러 개의 application.properties 필요
문법
: application-프로파일명.properties (yml)
application.properties (기본)
에서 동작할 프로파일명 지정
- spring.profiles.active = prod
(지정한 프로파일명에 해당하는 application-프로파일.properties가 실제로 실행됨)
application-dev.properties (개발용)
application-prod.properties (product용)
spring.profiles.active = prod
@Profile("dev")
public class DevBean{ }
@Profile("prod")
public class ProdBean{ }
https://docs.spring.io/spring-framework/docs/5.2.25.RELEASE/spring-framework-reference/core.html#aop
cf) OOP (Object Orietned Programming : 객체 지향 프로그래밍)
브라우저 ----------------> A서블릿 -----> 서비스 -----> DAO ------> DB
(핵심기능:필수) (핵심기능) (핵심기능)
+ + +
부수기능) 부수기능) 부수기능)
브라우저 ----------------> B서블릿 -----> 서비스 -----> DAO ------> DB
(핵심기능:필수) (핵심기능) (핵심기능)
+ + +
부수기능) 부수기능) 부수기능)
@Service
public class DeptServiceImpl{
int num; // 값 변경 이벤트
public void setNum(int n){ } // 메서드 호출 이벤트
public int getNum(){ } // 메서드 호출 이벤트
public DeptServiceImpl(){ } // 생성자 호출 이벤트
..
}
@Aspect
public class MyAspect{
public void log_print(){
s.o.p("로그출력");
}
}
execution("public int getNum()")
execution("public int get*()")
execution("public * get*()")
execution("public * get*(**)")
전 : @Before
후 : @After
성공 : @AfterReturning
실패 : @AfterThrowing
(전,후,성공,에러) : @Around
예>
DeptServiceImpl service = ctx.getBean();
//전
int n = service.getNum();
//후
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
==> aspectjweaver-1.9.7.jar 다운로드됨
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
Object retVal = pjp.proceed();
return retVal;
}
public class CommonPointcutConfig {
@Pointcut("execution(public say(..))")
public void businessService() {}
@Pointcut("execution(public aa(..))")
public void businessService2() {}
}