// 1. 생성자주입(Constructor Injection)
@Component
public class MadExample {
// final로 선언할 수 있는 보너스
private final HelloService helloService;
// 단일 생성자인 경우는 추가적인 어노테이션이 필요 없다.
public MadExample(HelloService helloService) {
this.helloService = helloService;
}
}
// 2. 필드주입(Field Injection)
@Component
public class MadExample {
@Autowired
private HelloService helloService;
}
// 3. 수정자주입(Setter Injection)
@Component
public class MadExample {
private HelloService helloService;
@Autowired
public void setHelloService(HelloService helloService) {
this.helloService = helloService;
}
}
순환참조를 한 경우 다른방식은 애플리케이션이 아무 오류나 경고없이 구동이되서 문제가될 수 있지만, 생성자주입방식으로 실행시 BeanCurrentlyInCreationException이 발생하며 애플리케이션이 구동조차안된다. 생성자 주입 방법은 필드 주입이나 수정자 주입과는 빈을 주입하는 순서가 다르기 때문.
** 빈이란?
Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다.
우리가 new 연산자로 어떤 객체를 생성했을 때 그 객체는 빈이 아니다.
ApplicationContext.getBean()으로 얻어질 수 있는 객체는 빈이다.
즉 Spring에서의 빈은 ApplicationContext가 알고있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미한다.
즉 순환참조가 발생하는 경우 애플리케이션이 구동되지 않는다.
— redirect
—forward
— 차이점
— JPA
장점
1-1. 쿼리를 하나하나 작성할 필요가 없어 코드량이 줄어든다
1-2. 가독성이 좋다.
1-3. 간편하게 수정이 가능하다. (유지보수, 리팩토링 용이)
1-4. 동일한 쿼리에 대한 캐시기능을 사용하기 때문에 더욱 높은 성능을 낼 수 있다.
단점
2-1. 매핑설계를 잘못했을 때 성능저하
2-2. JPA를 제대로 사용하려면 학습하는데 오래걸린다.
2-3. 다수의 테이블 조인시 신경써야할게 많다.
— Mybatis
장점
1-1. 접근이 쉽고 코드가 간결하다.(배우기 쉽다.)
1-2. SQL문과 프로그래밍 코드가 분리되어있어서 SQL문에 변경이 있을 때마다 자바 코드를 수정하거나 컴파일 하지 않아도 된다.
1-3. 다양한 프로그래밍 언어로 구현이 가능하다.(이식성이 뛰어나다)
단점
2-1. 스키마 변경시 SQL 쿼리를 직접 수정해야 한다.
2-2. 반복된 쿼리가 발생하여 반복작업이 있다.
2-3. 쿼리를 직접 작성하기 때문에 데이터베이스에 종속된 쿼리문이 발생할 수 있다.
2-4. 데이터베이스 변경 시 로직도 함께 수정해주어야 한다.
local session cache
임의로 켜거나 끌 수 없고 ,무조건 활성화
SqlSession 객체마다 가지고 있는 캐시… 켜거나 끌 수없지만 적용범위는 조정 가능
default는 적용범위는 SESSION으로 되어있음.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="localCacheScope" value="STATEMENT" /> <!-- STATEMENT / SESSION -->
</settings>
</configuration>
SESSION 적용시
STATEMENT 적용시
statement 하나가 끝나면 바로 캐시데이터를 폐기하고 다음번 데이터 찾을 때 다시 새로운 데이터를 찾는데 시간을 소모한다.
따라서 statement로 설정하고 일반적으로 mapper를 구성해서 사용하면 거의 캐시를 사용하지 않는것과 비슷한 효과를 낼것..
second level cache
mapper namespace단위로 동작하여 켜거나 끌 수 있음.
( mapper.xml 파일안에 입력하면 됨 )
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.TestMapper">
<cache/>
...
</mapper>
위의 mapper의 namespace는 “mapper.TestMapper”이며, 여기서 선언한 모든 SQL에 대해서는 Cache가 적용된다. 각 mapper에서 설정한 cache 기능을 일괄적으로 disable하고 싶으면, Global configuration에 선언하면됨.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="false"/>
</settings>
<environments default="testdb">
<environment id="testdb">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhot:3306/test?characterEncoding=utf8" />
<property name="username" value="test" />
<property name="password" value="test" />
</dataSource>
</environments>
<mappers>
<mapper resource="mybatis/test_mapper.xml" />
</mappers>
</configuration>
cacheEabled 값 false처리.. default는 true이다.
local cache는 statement 실행후 commit이 되면 캐시를 지우는데, second level cache는 commit을 해도 캐시데이터가 살아있다.
config.stopBubbling = true
lombok.data.flagUsage=error
lombok.value.flagUsage=error
lombok.val.flagUsage=error
lombok.var.flagUsage=error
lombok.nonNull.flagUsage=error
lombok.allArgsConstructor.flagUsage=error
lombok.requiredArgsConstructor.flagUsage=error
lombok.cleanup.flagUsage=error
lombok.sneakyThrows.flagUsage=error
lombok.synchronized.flagUsage=error
# experimental 전체 금지
lombok.experimental.flagUsage=error
참고: https://kwonnam.pe.kr/wiki/java/lombok/pitfall
참조: http://www.sysout.co.kr/home/webbook/page/read/643;jsessionid=54B3D5320E73A41FC4088D5E3D322141
SpEL( Spring expression language ) 을 표기할 때 사용,
#{표현식}
${ } 표기는 SpEL이 아니라 프로퍼티를 참조할때 사용
${property.name}
표현식은 프로퍼티를 가질 수 있지만, 프로퍼티는 표현식을 가지지 못한다
#{${my.data} + 1}
사용자가 요청할때마다, connect, disconnect를 반복하는 것이 비효율적이기 때문에
커넥션풀(DBCP) 사용
참조 : https://linked2ev.github.io/spring/2019/08/14/Spring-3-커넥션-풀이란/
참조: https://velog.io/@damiano1027/Spring-Spring-MVC-Request-Lifecycle