* ์กฐ์ธ ํฌ์ธํธ(Join point) ์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋ ์ ์๋ ์์น, ๋ฉ์๋ ์คํ, ์์ฑ์ ํธ์ถ, ํ๋ ๊ฐ ์ ๊ทผ, static ๋ฉ์๋ ์ ๊ทผ ๊ฐ์ ํ๋ก ๊ทธ๋จ ์คํ ์ค ์ง์ ์กฐ์ธ ํฌ์ธํธ๋ ์ถ์์ ์ธ ๊ฐ๋
์ด๋ค. AOP๋ฅผ ์ ์ฉํ ์ ์๋ ๋ชจ๋ ์ง์ ์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค. ์คํ๋ง AOP๋ ํ๋ก์ ๋ฐฉ์์ ์ฌ์ฉํ๋ฏ๋ก ์กฐ์ธ ํฌ์ธํธ๋ ํญ์ ๋ฉ์๋ ์คํ ์ง์ ์ผ๋ก ์ ํ๋๋ค. * ํฌ์ธํธ์ปท(Pointcut) ์กฐ์ธ ํฌ์ธํธ ์ค์์ ์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋ ์์น๋ฅผ ์ ๋ณํ๋ ๊ธฐ๋ฅ ์ฃผ๋ก AspectJ ํํ์์ ์ฌ์ฉํด์ ์ง์ ํ๋ก์๋ฅผ ์ฌ์ฉํ๋ ์คํ๋ง AOP๋ ๋ฉ์๋ ์คํ ์ง์ ๋ง ํฌ์ธํธ์ปท์ผ๋ก ์ ๋ณ ๊ฐ๋ฅ * ํ์ผ(Target) ์ด๋๋ฐ์ด์ค๋ฅผ ๋ฐ๋ ๊ฐ์ฒด, ํฌ์ธํธ์ปท์ผ๋ก ๊ฒฐ์ * ์ด๋๋ฐ์ด์ค(Advice) ๋ถ๊ฐ ๊ธฐ๋ฅ ํน์ ์กฐ์ธ ํฌ์ธํธ์์ Aspect์ ์ํด..
๋ถ๋ฅ ์ ์ฒด๋ณด๊ธฐ
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPHr0c%2FbtsB2PgCpIc%2FjWCUACoNjNEZEOGY4BWDU1%2Fimg.png)
0. ์ปฌ๋ ์
์ปฌ๋ ์
์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ ์ฒ๋ฆฌํ๋ ํน์ง์ ์ด๋ ค sql ์ง์์ ๊ฐ์ด ๋น์ทํ๊ฒ ๋ง๋ค ์ ์๋ค. → ์ ์ธํ ์ด์ ๊ฐ์ด ๋ง์ ์์๋ฅผ ํฌํจํ๋ ์ปค๋ค๋ ์ปฌ๋ ์
์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ํ์ํ๋ค. ⇒ ์คํธ๋ฆผ์ด ํด๊ฒฐ์ฑ
! 1. ์คํธ๋ฆผ ์๊ฐ ์๋ฐ 8์์ ์ถ๊ฐ๋ ๊ธฐ๋ฅ ์ ์ธํ์ผ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ ๋ฉํฐ์ค๋ ๋ ์ฝ๋ ๊ตฌํ ์์ด ๋ณ๋ ฌ๋ก ํฌ๋ช
ํ๊ฒ ์ฒ๋ฆฌ ๊ฐ๋ฅ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ณ๋ ฌํํ๋ฉด์ ์ค๋ ๋์ ๋ฝ์ ๊ฑฑ์ ํ ํ์๊ฐ ์์ ์คํธ๋ฆผ ์ ์ฉ ์ ์ ์๋ฐ 7์ฝ๋ List lowCaloricDishes = new ArrayList(); for(Dish dish: menu) { // ๋์ ์๋ก ์์ ํํฐ๋ง if(dish.getCalories() < 400) { lowCaloricDishes.add(dish); } } // ์ต๋ช
ํด๋์ค๋ก..
์ด๊ฑด ๋ด๊ฐ ๊ฒฝํํ ํธ๋ฌ๋ธ์ ์๋๊ณ ์ฐ๋ฆฌ ์คํฐ๋์์ด ๊ฒช์ ์๋ฌ๋ฅผ ๊ฐ์ด ํด๊ฒฐํด๋ดค๋ค. ์ฌ๋ฐ์์ด์ ํฌ์คํ
. spring data jpa + spring boot 3.2.0 + h2 2.2.224 + querydsl 5.0.0 ํ๊ฒฝ๊ตฌ์ฑ์ด๋ค. ์ ์ h2DB๋ฅผ 1.4.๋ช์ผ๋ก ๊น์๋จ์๋ค๊ณ ํ๋ค. ์ผ๋จ DB๋ ๋ค ์ญ์ ํ๊ณ ๋ค์ ๋ฒ์ ์ ๋ง๋ ๊ฑธ ์ค์นํ๋๋ฐ๋ Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "start_value" not found [42122-224] org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' d..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1zQNK%2FbtsBypaVY4w%2FjDXTzjfFrptpAxzwIhbIfk%2Fimg.png)
๋๋ค ํํ์ 3.1 ๋๋ค๋ ๋ฌด์์ธ๊ฐ? ๋ฉ์๋๋ก ์ ๋ฌํ ์ ์๋ ์ต๋ช
ํจ์๋ฅผ ๋จ์ํํ ๊ฒ [ํน์ง] ์ต๋ช
๋ณดํต์ ๋ฉ์๋์ ๋ฌ๋ฆฌ ์ด๋ฆ์ด ์์ผ๋ฏ๋ก ์ต๋ช
์ด๋ผ ํํํ๋ค. ํจ์ ๋๋ค๋ ๋ฉ์๋์ฒ๋ผ ํน์ ํด๋์ค์ ์ข
์๋์ง ์์ผ๋ฏ๋ก ํจ์๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํ์ง๋ง ๋ฉ์๋์ฒ๋ผ ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ, ๋ฐ๋, ๋ฐํ ํ์, ๊ฐ๋ฅํ ์์ธ ๋ฆฌ์คํธ๋ฅผ ํฌํจํ๋ค. ์ ๋ฌ ๋๋ค ํํ์์ ๋ฉ์๋ ์ธ์๋ก ์ ๋ฌํ๊ฑฐ๋ ๋ณ์๋ก ์ ์ฅํ ์ ์๋ค. ๊ฐ๊ฒฐ์ฑ ์ต๋ช
ํด๋์ค์ฒ๋ผ ๋ง์ ์์ง๊ตฌ๋ ํ ์ฝ๋๋ฅผ ๊ตฌํํ ํ์๊ฐ ์๋ค. ๋๋ค๋ฅผ ํ์ฉํ์ฌ ๋ฐ๊พผ ์ฝ๋ Comparator byWeight = new Comparator() { public int compare(Apple a1, Apple a2) { return a1.getWeight().compareTo(a2.getWeight()..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYaHpk%2FbtsAPKVnENm%2FWCIHyiKEkNXwJ9kE2Wxku0%2Fimg.png)
๊น์ํ ์ ์๋ ์๋ฐ ์ฝ๋๋ฅผ ์คํ๋ง๋ถํธ 3.1.5๋ก ์
๊ธํ๋ฉด์ ๋ฐ์ํ ๋ฌธ์ . gradle ๋ฒ์ ์ถฉ๋ ๋ฌธ์ ๋ค ํ๋ก์ ํธ ์ด๋ฆ/gradle/wrapper/gradle-wrapper.properties distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip ์ด๊ฑฐ๋ฅผ distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip 7.2 -> 7.6 ๋ณ๊ฒฝ ํ gradle ๋ค์ ์๋ก ๊ณ ์นจํ๋ฉด ์๋๋ค.
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkNv49%2FbtsAaYgcO5V%2FfAV2AMHS8TZGHZc21Gs8Ik%2Fimg.png)
flyweight pattern 1. Flyweight Fly(๊ฐ๋ฒผ์ด) + Weight(๋ฌด๊ฒ)๋ฅผ ๋ปํ๋ฉฐ, ๋ณต์ฑ์ ์ฒด๊ธ์์ ์ ๋๋์๋ค. ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ผ์ผํ ์ธ์คํด์คํ ํ์ง์๊ณ ์ฌ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด๋ ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ณ๊ฒ ๋ง๋ ๋ค๋ ์๋ฏธ๋ก์ ์ฐ์ธ๋ค๊ณ ๋ณด๋ฉด ๋๋ค. ⇒ ๊ฐ๋ณ๊ฒ ๋ง๋ ๋ค! ๊ณต์ ๋ ์์๊ณผ ๊ทธ๋ ์ง ์์ ์์์ ์ฌ์ฉ๋ ์ฐจ์ด 2. Flyweight ํจํด ๊ตฌ์กฐ Flyweight : ๊ฒฝ๋ ๊ฐ์ฒด๋ฅผ ๋ฌถ๋ ์ธํฐํ์ด์ค ConcreteFlyweight : ๊ณต์ ๊ฐ๋ฅํ์ฌ ์ฌ์ฌ์ฉ๋๋ ๊ฐ์ฒด(intrinsic state) UnsahredConcreteFlyweight: ๊ณต์ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด (extrinsic state) FlyweightFactory : ๊ฒฝ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ณต์ฅ ์ญํ ๊ณผ ์บ์ ์ญํ ์ ๊ฒธ๋นํ๋ Flywei..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feq2cm1%2Fbtsz3KB0a86%2FxU2WQU4OcDHyoCBy06bIkk%2Fimg.png)
1. ํ (Queue)ํ๋ ์ด๋ ๊ฒ ์ ์
์ ์ถ(FIFO) ๊ตฌ์กฐ์ด๋ค.์ฐ์ฐ ๊ณผ์ ์๋- enqueue : ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ์์
- dequeue : ํ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๋ ์์
- front : ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๋ ๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ- rear : ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ด๋ฐ ๊ฐ๋
๋ค์ด ๋ฑ์ฅ ํ๋ค. 1. ์ฝ๊ฒ ์ดํด๋ฅผ ์ํด ์์ ๋ฅผ ์ดํด ๋ณด๊ฒ ๋ค.์ฐ๋ฆฌ๊ฐ ์ค ์์๋ ๋๊ธฐ์ด์ ์๊ฐํ๋ฉด ์ฝ๋ค.ํฐ์ผ ๋งคํ์์ ์ด๋ ๊ฒ ์ค์ ์ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.์ค์ ์ ์ผ ๋จผ์ ์ A๊ฐ ๋จผ์ ํ๋ฅผ ์ฌ๊ณ , ์ ์ผ ๋์ค์ ์ E๊น์ง ๋ชจ๋ ์์๋๋ก ํ๋ฅผ ์ด ์ ์์ ๊ฒ์ด๋ค.์ด๋ ๊ฒ ๊ทผ๋ฐ ์ฌ๊ธฐ์ F๊ฐ ๋ฑ์ฅํด์ ์ค์ ์ ๋ค.๊ทธ๋ผ ์ด๋ rear๋ ์๋ก ์ถ๊ฐ๋ ๋งจ ๋ค์ F๋ก ๋๋ค.์ด F๋ฅผ ์ถ๊ฐํ๋ ์์
์ enqueue ๋ผ๊ณ ํ๊ณ , F ์ถ๊ฐํ ์์น๋ฅผ ๋ํ๋ด๋..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqYqCA%2FbtsyFnI0fs6%2FGzMHrtsXQ8AnGNW96FsA5K%2Fimg.png)
Singleton Singleton ํจํด? ⇒ ์ธ์คํด์ค๊ฐ ํ๋๋ง ์กด์ฌํ๋ ๊ฒ์ ๋ณด์ฆํ๋ ํจํด ์ฅ์ ์ธ์คํด์ค๊ฐ ํ๋๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ ์ ์์ ์ ์ญ ์ธ์คํด์ค์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค์ ์ธ์คํด์ค๋ค์ด ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ ์ฌ์, ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ณด์ฅ ์ดํ๋ฆฌ์ผ์ด์
์ ์ธํ
๊ฐ( ๋ฐฐ๊ฒฝ์ ), DBCP, ๋ก๊ทธ ๊ธฐ๋ก ๊ฐ์ฒด DBCP! ํ ๋ง์์! db์ ์๋ฒ๊ฐ ์ฐ๊ฒฐํ๋ connection ์์
์ ๋น์ฉ์ด ํผ ⇒ ๋ค์์ ์ฌ์ฉ์ ๋์๋ค๋ฐ์ ์ผ๋ก ์ฌ์ฉ์ ์๋ฒ ๋ค์ด์ฌ๋ฌ ์ปค๋ฅ์
๋ค์ ๋ฏธ๋ฆฌ ๋ด์๋๊ณ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋๋ง๋ค ํ๋์ฉ ๊บผ๋ด์ ๋น๋ ค์ค ์ปค๋ฅ์
์ด ๋ค ๋จ์ด์ง๋ฉด ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐํํ ๋๊น์ง ๋๊ธฐ์ํ๋ก ์ ํ ๋ค์ด์ด๊ทธ๋จ ๊ธฐ๋ณธ ๊ณจ๊ฒฉ : Eager Initialization (์ด๋ฅธ ์ด๊ธฐํ) public class Singl..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6T5X%2FbtsyDRIFyGN%2FBpVWXSK9K8i6Q4lXjphiv0%2Fimg.png)
--[Quiz]์ต๊ทผ 12๊ฐ์๋์์ ๋ ์ง(yyyymm)์ถ๋ ฅํ๊ธฐ SELECT TO_CHAR(ADD_MONTHS(TO_DATE('201501','YYYYMM'), LEVEL-1),'YYYYMM') months FROM DUAL CONNECT BY LEVEL
๋ฌธ์ ์ค๋ช
๋ค์์ ์ด๋ ์๋ฅ ์ผํ๋ชฐ์ ์จ๋ผ์ธ ์ํ ํ๋งค ์ ๋ณด๋ฅผ ๋ด์ ONLINE_SALE ํ
์ด๋ธ๊ณผ ์คํ๋ผ์ธ ์ํ ํ๋งค ์ ๋ณด๋ฅผ ๋ด์ OFFLINE_SALE ํ
์ด๋ธ ์
๋๋ค. ONLINE_SALE ํ
์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ผ๋ฉฐ ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE๋ ๊ฐ๊ฐ ์จ๋ผ์ธ ์ํ ํ๋งค ID, ํ์ ID, ์ํ ID, ํ๋งค๋, ํ๋งค์ผ์ ๋ํ๋
๋๋ค. Column name Type Nullable ONLINE_SALE_ID INTEGER FALSE USER_ID INTEGER FALSE PRODUCT_ID INTEGER FALSE SALES_AMOUNT INTEGER FALSE SALES_DATE DATE FALSE ๋์ผํ ๋ ์ง,..