์ธํฐ์ ํฐ (Interceptor)
ํํฐ์๋ ๋ฌ๋ฆฌ Spring์ด ์ ๊ณตํ๋ ๊ธฐ์ . diapatcher์ servlet์ ์ค๊ฐ.
DispatcherServlet์ด ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ ์ ๊ณผ ํ์ ์์ฒญ๊ณผ ์๋ต์ ์ฐธ์กฐํ๊ฑฐ๋ ๊ฐ๊ณตํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณต
์น์ปจํ ์ด๋(์๋ธ๋ฆฟ ์ปจํ ์ด๋)์์ ๋์ํ๋ ํํฐ์ ๋ฌ๋ฆฌ ์ธํฐ์ ํฐ๋ ์คํ๋ง ์ปจํ ์คํธ์์ ๋์์ ํ๋ค.
์ธํฐ์ ํฐ์ ๋ฉ์๋ 3๊ฐ์ง
- preHandler : ์ปจํธ๋กค๋ฌ๊ฐ ์คํ๋๊ธฐ ์ ์ ์คํ, ๋ฆฌํด ๊ฐ์ด boolean ๊ฐ. ๋ฆฌํด๊ฐ์ด true๋ฉด ๋ค์๋จ๊ณ๋ก ์งํ, false๋ผ๋ฉด ์์ ์ ์ค๋จํ์ฌ ์ดํ์ ์์ ์ ์งํ ์๋จ. (ex.ํ์์ ๋ง๋ ๋ธ๋๋ฆฌ์คํธ ํ์์ผ๋)
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
- postHandler : ์ปจํธ๋กค๋ฌ๊ฐ ์คํ๋ ํ์ ์คํ
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
- afterCompletion : ๋ทฐ๊ฐ ์ํํ๊ณ ๋์(๋ชจ๋ ์์ ์ด ์๋ฃ๋ ํ์) ์คํ. postHandler์ ๋ฌ๋ฆฌ ์ปจํธ๋กค๋ฌ ํ์ ๊ณ์ธต์์ ์์ ์ ์งํํ๋ค๊ฐ ์ค๊ฐ์ ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ afterCompletion์ ๋ฐ๋์ ํธ์ถ๋๋ค.
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TestInterceptor())
.addPathPatterns("/hello");
/*
registry.addInterceptor(์ธํฐ์
ํฐ๊ฐ์ฒด)
.addPathPatterns("/*") - ๋ชจ๋ Path ์ ์ฉ
.excludePathPatterns("/sample"); - /sample Path ์ ๋ํด์๋ง ์ ์ธ
*/
}
}
addInterceptors๋ผ๋ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์ฒ๋ฆฌํ๋ค. ๋งคํ๋ช ์ด /hello๋ฅผ ๊ฐ๋ ๊ฒ ์์ฒญ๋ ๊ฒฝ์ฐ์๋ง TestInterceptor๋ฅผ ์ํํ๋ค. excludePathPatterns๋ ํด๋น ๋งคํ๋ช ์ ๋ํด์๋ง ์ ์ธํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค.
addPathPatterns("/*")๋ ๋ชจ๋ Path์ ์ ์ฉ๋๋ค๋ ์๋ฏธ์ด๋ค.
addInterceptor() : ๋ฑ๋กํ ์ธํฐ์ ํฐ ์ค์
addPathPatterns() : ์ ์ฉํ URL ํจํด ์ค์
excludePathPatterns() : ์ธํฐ์ ํฐ๋ฅผ ์ ์ธํ URL ํจํด ๋ฑ๋ก
์ด๋ฐ์์ผ๋ก ์ฐจ๋ก๋ก ์ํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํํฐ vs ์ธํฐ์ ํฐ ์ฐจ์ด
AOP (Aspect-Oriented Programming)
ํต์ฌ๊ธฐ๋ฅ๊ณผ ๊ณตํต๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ๊ฑธ์ณ ์ฌ์ฉ๋๋ ๊ณตํต ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ ๊ฒ.
๊ด์ (๊ด์ฌ) ์งํฅ ํ๋ก๊ทธ๋๋ฐ. → ํ๋ก์ ํธ์ ๊ตฌ์กฐ, ๊ตฌ์ฑ์ ๋ฐ๋ผ๋ณด๋ ๊ด์ ์ ๋ฐ๊ฟ๋ณด์๋ ๋ป.
OOP๋ฅผ ๋ฌผ๋ ค๋ฐ๋ ์ ๋ค..
๊ธฐ์กด์ OOP์์ ๋ฐ๋ผ๋ณด๋ ๊ด์ ์ ๋ฌ๋ฆฌ ํ์ฌ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ธ ์ธก๋ฉด์์ ๋ณด์์ ๋ ๊ณตํต๋ ์์๋ฅผ ๋ถ๋ฆฌํ์๋ ๊ฒ์ด ๋ฐ๋ผ AOP ํ๋ก๊ทธ๋๋ฐ์ ์ฃผ์ ์ฌ์.
๊ฐ๋ก ์์ญ์ ๊ณตํต๋ ๋ถ๋ถ์ ์๋ผ๋๋ค๊ณ ํด์ AOP๋ฅผ ํฌ๋ก์ค ์ปทํ ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํจ.
OOP : ๋น์ฆ๋์ค ๋ก์ง(ํต์ฌ๊ธฐ๋ฅ)์ ๋ชจ๋ํ, ๋ชจ๋ํ์ ๋จ์๋ ๋น์ฆ๋์ค ๋ก์ง
AOP : ๊ณตํต๊ธฐ๋ฅ์ ๋ชจ๋ํ. (์ : ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น , ๋๊ธฐํ, ์ค๋ฅ๊ฒ์ฌ ๋ฐ ์ฒ๋ฆฌ, ์ฑ๋ฅ ์ต์ ํ ๋ฑ ๊ฐ๊ฐ์ ๋ชจ๋๋ค์ ์ฃผ ๋ชฉ์ ์ธ์ ํ์ํ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ๋ค)
AOP๋ ๊ฐ๊ฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ถ๊ฐ๋ก ๊ตฌํ๋๋ ๊ณตํต๋ ๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ๋ ๊ธฐ๋ฒ.
OOP์์๋ ๊ณตํต๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ์์, ์์์ ์ฌ์ฉํจ. ๊ทธ๋ฌ๋ ๊น๋ํ ๋ชจ๋ํ๊ฐ ์ด๋ ค์ ์. ๊ทธ๋์ AOP๊ฐ ๋ฑ์ฅ.
AOP ์ฅ์ : ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ํฉ์ด์ ธ ๊ตฌํ๋๋ ๊ณตํต๊ธฐ๋ฅ์ด ํ๋์ ์ฅ์์์ ๊ด๋ฆฌ๋์ด ์ ์ง๋ณด์์ ์ข์. ํต์ฌ๊ธฐ๋ฅ๊ณผ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ช ํํ ๋ถ๋ฆฌ๋ก, ํต์ฌ๋ก์ง์ ์์ ์ ๊ธฐ๋ฅ์๋ง ์ง์คํ ์ ์๋ค.
ํต์ฌ๊ธฐ๋ฅ๊ณผ ๋ฝ์๋ธ ๊ธฐ๋ฅ์ ํฉ์น๋ ๊ฒ์ weaving์ด๋ผ๊ณ ํ๋ค. pointcut์ ์ํด ์ ํด์ง Target์ JoinPoint์ Advice๋ฅผ ์ ์ฉํ๋ ๊ฒ
AOP ์ ์ฉ ๋ฐฉ์ 3๊ฐ์ง ๋ฐฉ๋ฒ
- ์ปดํ์ผ ์์ : ํน๋ณํ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํด์ผํจ
- ํด๋์ค ๋ก๋ฉ ์์ : ํด๋์ค๊ฐ ๋ก๋ฉ๋ ๋ weaving์ํจ๋ค. ํด๋์ค ๋ก๋ ์กฐ์๊ธฐ๋ฅผ ์ง์ ํด์ผ ํจ.
- ๋ฐํ์ ์์ : ์คํ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ์. ํด๋์ค ๋ก๋ฉ์ด ์๋ฃ๋ ํ ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ค์์ ๋์ํ๋ ๋ฐฉ์. ํน๋ณํ ์ปดํ์ผ๋ฌ, ํด๋์ค ๋ก๋ ์กฐ์๊ธฐ๋ฅผ ์ฌ์ฉํ์ง ์์๋ AOP๋ฅผ ์ ์ฉํ ์ ์๋ค.
AOP ์ฉ์ด
์กฐ์ธ ํฌ์ธํธ ( Join point )
๋ฉ์๋ ์คํ์์ , ๋ฉ์๋ ํธ์ถ ์์ , ๊ฐ์ฒด ์์ฑ, ์์ฑ์ ํธ์ถ ํ๋ ์์ ๋ฑ์ ์กฐ์ธ ํฌ์ธํธ๋ผ๊ณ ํ๋ค.
ํฌ์ธํธ์ปท
์กฐ์ธ ํฌ์ธํธ ์ค์์ ๊ณตํต ๊ธฐ๋ฅ์ด ์ ์ฉ๋ ์์น๋ฅผ ์ ๋ณํ๋ ๊ธฐ๋ฅ.
Aspect (Adviser : ์คํ๋ง ์ฉ์ด)
Advice + Pointcut์ ๋ชจ๋ํ ํ ๊ฒ
@Before : ๋ฉ์๋๊ฐ ํธ์ถํ๊ธฐ ์ ์ ๋ถ๋ฌ์๋ผ..
@After : ํธ์ถํ๊ณ ๋์ ์ํํ ๋ ์.
AOP ํ๋ก์
AOP ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๋ง๋ ํ๋ก์ ๊ฐ์ฒด
@Aspect : Advisor๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๋๋ก ๋์์ฃผ๋ ์ญํ . ์ปดํฌ๋ํธ ์ค์บ์ด ๋๋ ๋์์ด ์๋๋ฏ๋ก ํด๋น ํด๋์ค๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด์ฃผ์ด์ผ ํ๋ค.
@Component(value="advice")
@Aspect
public class CalcAdvice {
Advice
@AfterThrowing : ๋ฉ์๋๊ฐ ์์ธ๋ฅผ ๋ฐ์์ํจ ๊ฒฝ์ฐ ์คํ. ์์ธ์กฐ์์ด ๋ถ๊ฐ๋ฅํ๋ค.
@After : ์กฐ์ธ ํฌ์ธํธ์ ์ ์, ์์ธ ๋์๊ณผ ๋ฌด๊ดํ๊ฒ ์คํํ๋ค.
Around ์ด๋๋ฐ์ด์ค : Before, After์ ๋ฌถ์ ๊ฒ๊ณผ ๋น์ท. ํ๋์ ๋ฉ์๋๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ around ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ๋จ.
Target์ ํต์ฌ๊ธฐ๋ฅ๋ง ๊ตฌํํ ๊ฐ์ฒด. Target์ ์ ์ฒด์ ์ผ๋ก ๊ฐ์ธ๊ณ ์๋ ์กด์ฌ๋ฅผ Proxy๋ผ๊ณ ํ๋ค. Proxy๋ ๋ด๋ถ์ ์ผ๋ก Target์ ํธ์ถํ์ง๋ง ์ค๊ฐ์ ํ์ํ ๊ณตํต๊ธฐ๋ฅ(Advice)๋ค์ ๊ฑฐ์ณ์ Target์ ๋ฉ์๋๋ค์ด ํธ์ถ๋๋๋ก ๋ง๋ค์ด์ง๋ค. Proxy๋ ๋๋ถ๋ถ ์คํ๋ง AOP ๊ธฐ๋ฅ์ ์ด์ฉํด์ ์๋์ผ๋ก ์์ฑ๋๋ ๋ฐฉ์์ผ๋ก ์ด์ฉํ๋ค.
JoinPoint๋ Target์ด ๊ฐ์ง ๋ฉ์๋๋ค.. Target์๋ ์ฌ๋ฌ ๋ฉ์๋๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ๋ฉ์๋์ ๊ณตํต๊ธฐ๋ฅ์ ๊ฒฐํฉํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํด์ผํ๋๋ฐ ์ด ๊ฒฐ์ ์ Pointcut ์ด๋ผ๊ณ ํจ.
์ด๋ ธํ ์ด์ ๋์ ์์
ํ๊ฒ ๋จธ์๋๊ฐ ์ฌ๋ฌ Advice์ ๋์์ด ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ๋์
Around → Before → AfterThrowing → AfterReturning → After → Around
@AfterReturning(pointcut="execution(public int aop04.*.*())", returning="ret" )
์ด๋ฐ์์ผ๋ก ๋ฆฌํด๋๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์ ์ฒ๋ฆฌํ ์ ์๋ค.
System.out.println("Before Around"); // Before
Object obj = null;
try {
obj = jp.proceed();
System.out.println("Around ๋ฆฌํด ๊ฐ : "+obj); //After
} catch(Exception e) {
System.out.println("Around ์์ธ ๋ฐ์ : "+e.getMessage()) //AfterThrowing
}
if (obj == null) //AfterReturning
obj = new Integer(0);
System.out.println("After Around");
return obj;
within : ํด๋์ค ํ์ ์ ์ง์ ํ๋ ๊ฒ์ผ๋ก ๊ทธ ์์ ๋ชจ๋ ๋ฉ์๋๊ฐ ๋งค์นญ๋จ.
bean : ์คํ๋ง ๋น์ ์ด๋ฆ์ผ๋ก AOP ์ ์ฉ ์ฌ๋ถ๋ฅผ ์ง์
@Override
public Status openConnection(String host) {
if (blackListedHost.contains(host)) {
return Status.BLACKLISTED;
}
if (internet == null) {
this.internet = new MyInternet();
}
return internet.openConnection(host);
}
์ด๋ฐ์์ผ๋ก ํ๋ฉด
์ฝ์์ฐฝ์ ์ด๋ฐ์์ผ๋ก ๋ํ๋๋ค.
@Component
@Aspect
public class MyAspect{
@Before("execution(public int aop04.*.*())")
public void b(JoinPoint joinPoint) {
System.out.println("Before");
}
@After("execution(public int aop04.*.*())")
public void a(JoinPoint joinPoint) {
System.out.println("After");
}
aop04.*.*() : ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด ์๋๋ค๋ ๋ป
@Before("execution(public void aop05.*.*())")
public void login(JoinPoint joinPoint) {
System.out.println("AOP ๊ฐ ์ ์ฉ๋ ์กฐ์ธํฌ์ธํธ์ ๋ํ ์ ๋ณด๋ฅผ ์ถ์ถํด ๋ณด์ฅ~~");
System.out.println(joinPoint);
System.out.println(joinPoint.getSignature());
System.out.println(joinPoint.getTarget());
System.out.println(joinPoint.toLongString());
System.out.println(joinPoint.toShortString());
System.out.println(joinPoint.getThis());
System.out.println("-------------------------------------------");
System.out.println("๋ก๊ทธ์ธ ์ฒ๋ฆฌ");
}
์ด๋ฐ์์ผ๋ก ์์ฑํด์ฃผ๋ฉด
์ฝ์์ ์ด๋ฐ์์ผ๋ก ์ถ๋ ฅ๋๋ค..
@Pointcut("execution(public void aop06.*.*())")
public void myWork() {
}
@Before("myWork()")
public void login(JoinPoint joinPoint) {
System.out.println("๋ก๊ทธ์ธ ์ฒ๋ฆฌ");
}
์ด๋ฐ์์ผ๋ก myWork()๋ก ๋ฉ์๋๋ก ๋ง๋ค์ด๋๊ณ ํธ์ถํ๋ ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ๋ ๊ฐ๋ฅํจ.
@Before("within(aop09.CoreEx)")
public void before(){
System.out.println("Before Advice");
}
within์์ ํด๋์ค ์ด๋ฆ์ ๋ฃ์ผ๋ฉด ํด๋์ค์ ๋ชจ๋ ๊ฒ Pointcut์ด ๋๋ค.
@AfterThrowing(pointcut="within(aop09.CoreEx)", throwing="e" )
public void afterThrowing(Throwable e){
System.out.println("์์ธ๊ฐ ์คํ๋ ๋ ํธ์ถ๋๋ Advice : "+e.getMessage());
}
ํธ์ถํ๋ ๋์์ ๋ฐ์ํ ์์ธ.
AfterThrowing ์์ฒด๊ฐ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด ์์ง ์์.
์์ธ ์ฒ๋ฆฌ๊น์ง ์ํ๋ค๋ฉด around advice๋ก ์ง์ ์์ธ๋ฅผ ์ก์ ์ ์์
@Before("bean(calc)")
public void before(){
System.out.println("์ฐ์ฐ์ ์์ํฉ๋๋ค.");
}
calc๋ผ๋ ์ด๋ฆ์ ๋น ๊ฐ์ฒด ์ฒ๋ฆฌ์.. ๋ผ๋ ๋ป
@Component("calc")
public class CalcMethod {
์ด๋ฐ์์ผ๋ก..
@Before("execution(public * aop13.DayServiceImpl.get*())")
get* ๋ฉด ๋ฉ์๋ ์ด๋ฆ์ด get์ผ๋ก ์์ํ๋ ๊ฒ ๊ฐ๋ฅดํด
@AfterThrowing(pointcut="execution(* *.*.error*())", throwing="e" )
ํจํค์ง ๋ช
, ํด๋์ค ๋ช
์ด ๋ญ๋ ๊ฐ์.. error๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ํ๋ ๋ฉ์๋ ์ฒ๋ฆฌ์์..
๊ฐ๊ธ์ System.exit(0)๋ฅผ ์ด์ฉํด ์ข ๋ฃํ๋ ๊ฑด ์ํ๋๊ฒ ์ข๋ค
@Around("execution(public * aop14.DayServiceImpl.*())")
๋ชจ๋ ๋ฉ์๋๊ฐ ๋จ.
ProceedingJoinPoint๋ JoinPoint์ ์์
pjp.getSignature().getName().startsWith("get")
'๋ฉ์๋์ด๋ฆ์ด get์ผ๋ก ์์ํ๋ ๊ฒ ํธ์ถ๋๋ค๋ฉด' ์ด๋ผ๋ ๋ป.
์คํ๋ง FW์ ํต์ฌ 3๋ ์์ (Spring Triangle)
IoC(์ ์ด์ ์ญ์ ), DI(์์กด์ฑ ์ฃผ์ ), AOP(๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ), PSA(์ด์๊ฐ๋ฅํ ์๋น์ค ์ถ์ํ)
PSA
์คํ๋ง์์ ์ ๊ณตํ๋ ๋ค์ํ ๊ธฐ์ ๋ค์ ์ถ์ํํด์ ๊ฐ๋ฐ์๊ฐ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ ์ธํฐํ์ด์ค
ํ๊ฒฝ์ ๋ณํ์ ๊ด๊ณ์์ด ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ ์ ์๋๋ก ํ๋ ์ถ์ํ ๊ตฌ์กฐ. POJO ์์น์ ์ฒ ์ ํ ๋ฐ๋ฅธ Spring์ ๊ธฐ๋ฅ์ผ๋ก Spring์์ ๋์ํ ์ ์๋ Library๋ค์ POJO ์์น์ ์งํค๊ฒ๋ PSA ํํ์ ์ถ์ํ๊ฐ ๋์ด์์์ ์๋ฏธ.
PSA๊ฐ ์ ์ฉ๋ ์ฝ๋๋ผ๋ฉด ๋์ ์ฝ๋๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ๋, ๋ค๋ฅธ ๊ธฐ์ ๋ก ๊ฐํธํ๊ฒ ๋ฐ๊ฟ์ ์๋๋ก ํ์ฅ์ฑ์ด ์ข๊ณ , ๊ธฐ์ ์ ํนํ๋์ด ์์ง ์๋ ์ฝ๋๋ฅผ ์๋ฏธ.
@Entity
DB ํ
์ด๋ธ์ ์๋ฐํ๋ก๊ทธ๋จ ์์์ ๊ฐ์ฒด๋ก ๋ค๋ค์ผ ํจ. ์๋ฐ ๊ฐ์ฒด๋ก ๋ค๋ฃจ๋๋ก ํ๋๊ฒ JPA์ ํต์ฌ. ๊ทธ๊ฒ ๋ฐ๋ก ORM. JPA๋ ๋ํ์ ์ธ ORM ๊ธฐ์ .์ด์ ๋ ์ด์ DBํ
์ด๋ธ ์ ๊ฒฝ์์ฐ๊ณ ๋ฐ์ดํฐ๋ก ์ฌ๊ธฐ๋ฉด ๋จ.
@Entity๊ฐ ๋ถ์ด์์ผ๋ฉด ์๋ฐ๊ฐ์ฒด๋ก ๋ง๋ค๋ ์ฐ๋ ์ด๋ ธํ ์ด์
์ด ์ด๋ฆํ๊ณ ๋งค์นญ๋๋ DBํ ์ด๋ธ์ด ์๋์ง ํ์ธํ๊ณ ์์ผ๋ฉด ๋ง๋ ๋ค.
@Entity
@Table(name="emp")
public class EmpDTO {
๋งค์นญํ ๋ empDTO(์ฒซ๊ธ์๋ ์๋ฌธ์๋ก ๋ณํํจ)๋ฅผ ์ฐพ์ผ๋ ค๊ณ ํ๋ Table(name="emp")๋ก ์ ์ด๋์ ์ด๋ฆ์ด emp๋ผ๋ ํ
์ด๋ธ์ ์ฐพ๋๋ก ํด๋จ๋ค.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@id๋ ์๋ณํค์ ์ญํ ์ ํ๋ ๋ณ์๋ผ๋ ๋ป.
@GeneratedValue(strategy = GenerationType.IDENTITY) ์ด๊ฑฐ๋ auto_increment๋ผ๋ ๋ป
@CreationTimestamp
private java.sql.Date writeDate;
@CreationTimestamp ์ด๊ฒ๋ง ์จ์ฃผ๋ง ๋ฐ์ดํฐ๊ฐ insertํ ๋ ์์ฑ๋๋ ์๊ฐ์ผ๋ก ์๋์ผ๋ก ์ธํ
ํด์ค.
<property name="hibernate.hbm2ddl.auto" value="update" />
ํ
์ด๋ธ์ด ์๋ค๋ฉด ๋ง๋ค์ด๋ผ.. ๋ํดํธ๋ none์.
์์ผ๋ฉด ๋ง๋ค์ง ๋ง๊ณ ์์ผ๋ฉด ๋ง๋ค์ด๋ผ → update
์์ด๋ ์๋ก ๋ง๋ค์ด๋ผ → create ๋ฃ์ด์ฃผ๋ฉด ๋จ. value์..
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" />
MySQL8๋ฒ์ ์ Dialect์ด ๋ง๋ค์ด์ง๋๋ก ํด๋ผ..
'๐ผ Full-Stack Study โก (feat. KOSA)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA, JQPL (0) | 2023.10.30 |
---|---|
JPA (0) | 2023.10.26 |
Spring Boot, ์ค๋ฅ ์ฒ๋ฆฌ, ์น์์ผ (0) | 2023.10.24 |
tailwind (0) | 2023.10.14 |
Mybatis (0) | 2023.10.12 |