0425 ~ 0501
# 0425 ~ 0501
# 0425 - Given-When-Then Pattern
# Given-When-Then Pattern?
Given-When-Then Pattern
์ BDD(Behaviour-Driven Development) ์ค ํ๋๋ก, Test Code ์คํ์ผ์ ํํํ๋ ํ๋์ ๋ฐฉ์์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
# Given (ํ ์คํธ ์ ์ ์ํ)
- ํ ์คํธ์์ ๊ตฌ์ฒดํํ๊ณ ์ ํ๋ ํ๋์ ์์ํ๊ธฐ ์ ์ ํ ์คํธ ์ํ๋ฅผ ์ค๋ช ํ๋ ๋ถ๋ถ
- ์ฆ, ์๋๋ฆฌ์ค ์งํ์ ํ์ํ ๊ฐ์ ์ค์ ํ๊ณ ํ ์คํธ์ ์ํ๋ฅผ ์ค์ ํ๋ค
# When (ํ ์คํธ ํ์)
- ๊ตฌ์ฒดํํ๊ณ ์ ํ๋ ํ๋
- ์ฆ, ์๋๋ฆฌ์ค ์งํ ํ์ ์กฐ๊ฑด ๋ช ์, ํ ์คํธํ๊ณ ์ ํ๋ ํ๋์ ๋ช ์ํ๋ค
# Then (ํ ์คํธ ๊ฒ์ฆ)
- ํน์ ํ๋์ผ๋ก ์ธํด ๋ฐ์ํ ๊ฒ์ผ๋ก ์์๋๋ ๋ณํ์ ๋ํด ์ค๋ช ํ๋ ๋ถ๋ถ
- ์ฆ, ์๋๋ฆฌ์ค๋ฅผ ์๋ฃํ์ ๋ ๋ณด์ฅํด์ผ ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ช ์ํ๊ณ ์์๋๋ ๋ณํ๋ฅผ ์ค๋ช ํ๋ค
@Test
void hasSkill_AlwaysTrue() {
// given
given(skills.hasSkill()).willReturn(true);
// when
boolean actual = person.hasSkill();
// then
assertThat(actual).isTrue();
}
# 0426 - @Modifying
# @Query์ด๋
Spring Data JPA์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก JpaRepository์ ๊ธฐ๋ณธ ๋ฉ์๋์, ๋ฉ์๋ ๋ค์ด๋ฐ๋ง์ ํตํด์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋๋ก ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ํ์ง๋ง, ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ์ฌ ์ฌ์ฉํ๊ณ ์ถ์๋ @Query annotation์ ์ฌ์ฉํ๋ค. JPQL ๋ฐ nativeQuery=true ์ต์ ์ผ๋ก ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
# @Modifying์ด๋
@Query Annotation์ผ๋ก ์์ฑ ๋ ๋ณ๊ฒฝ, ์ญ์ ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ํ์ํ๋ค. ์ฆ, ์กฐํ ์ฟผ๋ฆฌ๋ฅผ ์ ์ธํ๊ณ , ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ INSERT, UPDATE, DELETE, DDL์์ ์ฌ์ฉํ๋ค. ์ฃผ๋ก ๋ฒํฌ ์ฐ์ฐ์์ ์ฌ์ฉ๋๋ค.
JPA Entity LifeCycle์ ๋ฌด์ํ๊ณ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์ ํด๋น annotation์ ์ฌ์ฉํ ๋๋ ์์์ฑ ์ฝํ
์คํธ ๊ด๋ฆฌ์ ์ฃผ์ํด์ผ ํ๋ค. ์์ผ๋ก ์ค๋ช
ํ clearAutomatically, flushAutomatically๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
# ๋ฒํฌ์ฐ์ฐ์ด๋
๋ฒํฌ ์ฐ์ฐ์ด๋ ๋จ๊ฑด UPDATE, DELETE๋ฅผ ์ ์ธํ ๋ค๊ฑด์ UPDATE, DELETE ์ฐ์ฐ์ ํ๋์ ์ฟผ๋ฆฌ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํ๋ค. JPA์์ ๋จ๊ฑด UPDATE ๊ฐ์ ๊ฒฝ์ฐ์๋ Dirty Checking์ ํตํด์ ์ํ๋๊ฑฐ๋ save()๋ก๋ ๊ฐ๋ฅํ๋ค. DELETE์ ๊ฒฝ์ฐ์๋ ๋ค๊ฑด, ๋จ๊ฑด ๋ชจ๋ ์ฟผ๋ฆฌ ๋ฉ์๋๋ก ์ ๊ณต๋๋ค.
@Query์ ๋ฒํฌ ์ฐ์ฐ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ , @Modifying์ ๋ถ์ด์ง ์์ผ๋ฉด, InvalidDataAccessApiUsage exception์ด ๋ฐ์ํ๋ค.
# clearAutomatically
์ด Attribute๋ @Modifying์ด ๋ถ์ ํด๋น ์ฟผ๋ฆฌ ๋ฉ์๋ ์คํ ์ง ํ, ์์์ฑ ์ปจํ ์คํธ๋ฅผ clear ํ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํ๋ Attribute์ด๋ค. defalut ๊ฐ์ false๋ค. true์ ๋ฒํฌ ์ฐ์ฐ ์ง ํ ์๋์ผ๋ก ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํด๋ฆฌ์ด ํด์ค๋ค.
# 0429 - JPA - OSIV
# OSIV(Open Sessio In View)
OSIV๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ทฐ๊น์ง ์ด์ด๋๋ ๊ธฐ๋ฅ์ด๋ค. ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ์ง๋๋ฉด ์ํฐํฐ๋ ์์ ์ํ๋ก ์ ์ง๋๋ค. ๋ทฐ๊น์ง ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ด์์๋ค๋ฉด ๋ทฐ์์๋ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ ์๊ฐ ์๋ค.
JPA์์๋ OEIV(Open EntityManage In View), ํ์ด๋ฒ๋ค์ดํธ์์ OSIV(Open Session In View)๋ผ๊ณ ํ๋ค. ํ์ง๋ง ๊ด๋ก์ ๋ ๋ค OSIV๋ก ๋ถ๋ฅธ๋ค.
# OSIV ๋์ ์๋ฆฌ
OSIV์ ๋์ ๋ฐฉ์์ ๋ํด์ Spring Framework๊ฐ ์ ๊ณตํ๋ OSIV๋ฅผ ํตํด ๋ณด๋ฉด, ์คํ๋ง์ด ์ ๊ณตํ๋ OSIV ํด๋์ค๋ ์๋ธ๋ฆฟ ํํฐ์์ ์ ์ฉํ ์ง ์คํ๋ง ์ธํฐ์ ํฐ์์ ์ ์ฉํ ์ง์ ๋ฐ๋ผ ์ํ๋ ํด๋์ค๋ฅผ ์ ํํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
- JPA OEIV ์๋ธ๋ฆฟ ํํฐ: org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter (opens new window)
- JPA OEIV ์คํ๋ง ์ธํฐ์ ํฐ: org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor (opens new window)
์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ OSIV๋ ๋น์ง๋์ค ๊ณ์ธต์์ ํธ๋์ญ์ ์ ์ฌ์ฉํ๋ OSIV๋ค. ์์์ฑ ์ปจํ ์คํธ๋ ์ฌ์ฉ์์ ์์ฒญ ์์ ์์ ์์ฑ์ด ๋์ง๋ง, ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฑฐ๋ ์์ ํ ์ ์๋ ํธ๋์ญ์ ์ ๋น์ฆ๋์ค ๊ณ์ธต์์๋ง ์ฌ์ฉํ ์ ์๋๋ก ํธ๋์ญ์ ์ด ์ผ์ด๋๋ค.
- spring.jpa.open-in-view : true ๊ธฐ๋ณธ๊ฐ
Spring Boot JPA์์กด์ฑ์ ์ฃผ์ ๋ฐ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ ๊ฒฝ์ฐ spring.jpa.open-in-view์ ๊ธฐ๋ณธ๊ฐ์ธ true๋ก ์ง์ ๋์ด ์์ด OSIV๊ฐ ์ ์ฉ๋ ์ํ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ด ๊ตฌ์ฑ๋๋ค.
๋์์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์๋ธ๋ฆฟ ํํฐ๋, ์คํ๋ง์ธํฐ์ ํฐ์์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๋ค. ๋จ ์ด ์์ ์์ ํธ๋์ญ์ ์ ์์ํ์ง ์๋๋ค.
- ์๋น์ค ๊ณ์ธต์์ @Transactional๋ก ํธ๋์ญ์ ์ ์์ํ ๋ 1๋ฒ์์ ๋ฏธ๋ฆฌ ์์ฑํด๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฐพ์์์ ํธ๋์ญ์ ์ ์์ํ๋ค.
- ์๋น์ค ๊ณ์ธต์ด ๋๋๋ฉด ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ณ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํ๋ฌ์ํ๋ค. ์ด ์์ ์ ํธ๋์ญ์ ์ ๋๋ด์ง๋ง ์์์ฑ ์ปจํ ์คํธ๋ ์ข ๋ฃ๋์ง ์๋๋ค.
- ์ปจํธ๋กค๋ฌ์ ๋ทฐ๊น์ง ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ์ง๋๋ฏ๋ก ์กฐํํ ์ํฐํฐ๋ ์์ ์ํ๋ฅผ ์ ์งํ๋ค.
- ์๋ธ๋ฆฟ ํํฐ๋, ์คํ๋ง ์ธํฐ์ ํฐ๋ก ์์ฒญ์ด ๋์์ค๋ฉด ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ข ๋ฃํ๋ค. ์ด๋ ํ๋ฌ์๋ฅผ ํธ์ถํ์ง ์๊ณ ๋ฐ๋ก ์ข ๋ฃํ๋ค.
์๋น์ค ๊ณ์ธต์์ ํธ๋์ญ์ ์ด ๋๋๋ฉด ์ปจํธ๋กค๋ฌ์ ๋ทฐ์๋ ํธ๋์ญ์ ์ด ์ ์ง๋์ง ์๋ ์ํ์ด๋ค. ์ํฐํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋จ์ํ ์กฐํ๋ง ํ ๋๋ ํธ๋์ญ์ ์ด ์์ด๋ ๋์ํ๋๋ฐ, ์ด๊ฒ์ ํธ๋์ญ์ ์์ด ์ฝ๊ธฐ(Nontransactional reads)๋ผ ํ๋ค. ํ์ฌ ๋ง์ฝ ํ๋ก์๋ฅผ ๋ทฐ ๋ ๋๋งํ๋ ๊ณผ์ ์ ์ด๊ธฐํ(Lazy loading)๊ฐ ์ผ์ด๋๊ฒ ๋์ด๋ ์กฐํ ๊ธฐ๋ฅ์ด๋ฏ๋ก ํธ๋์ญ์ ์ด ์์ด ์ฝ๊ธฐ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์์์ฑ ์ปจํ ์คํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํธ๋์ญ์ ๋ฒ์ ์์์ ์ํฐํฐ๋ฅผ ์กฐํํ๊ณ ์์ ํ ์ ์๋ค.
- ์์์ฑ ์ปจํ ์คํธ๋ ํธ๋์ญ์ ๋ฒ์ ๋ฐ์์ ์ํฐํฐ๋ฅผ ์กฐํ๋ง ํ ์ ์๋ค. ์ด๊ฒ์ ํธ๋์ญ์ ์์ด ์ฝ๊ธฐ(Nontransactional reads)๋ผ ํ๋ค.
๋ง์ฝ ํธ๋์ญ์ ๋ฒ์ ๋ฐ์ธ ์ปจํธ๋กค๋ฌ์ ๋ทฐ์์ ์ํฐํฐ๋ฅผ ์์ ํ์ฌ๋ ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๊ฐ์ง์ ์ํ ๋ฐ์ดํฐ ์์ ์ด ๋ค์ 2๊ฐ์ง ์ด์ ๋ก ๋์ํ์ง ์๋๋ค.
- ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๋ ค๋ฉด ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํ๋ฌ์(flush)ํด์ผ ํ๋ค. ์คํ๋ง์ด ์ ๊ณตํ๋ OSIV๋ ์์ฒญ์ด ๋๋๋ฉด ํ๋ฌ์๋ฅผ ํธ์ถํ์ง ์๊ณ em.close()๋ก ์์์ฑ ์ปจํ ์คํธ๋ง ์ข ๋ฃ์์ผ ๋ฒ๋ฆฐ๋ค.
- ํ๋ ์ ํ ์ด์ ๊ณ์ธต์์ em.flush()๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ ๋ก ํ๋ฌ์ํด๋ ํธ๋์ญ์ ๋ฒ์ ๋ฐ์ด๋ฏ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์๋ค๋ ์์ธ๊ฐ ์ผ์ด๋๋ค. (javax.persistence.TransactionRequiredException)
# OSIV ์ฌ์ฉ์ ์ฃผ์์
2021-01-18 21:54:44.750 WARN 36808 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
spring.jpa.open-in-view์ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ(true)์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์
์ ๊ตฌ๋ํ๋ฉด, ์ดํ๋ฆฌ์ผ์ด์
์์ ์์ ์ ์์ ๊ฐ์ warn ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ฒ ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ ๋์ ๋ฐฉ์์ฒ๋ผ ํ๋ก์๋ฅผ ์ด๊ธฐํํ๋ ์์
์ Service ๊ณ์ธต์์ ๋๋ด์ง ์๊ณ ๋ ๋ ๋๋ง ์ ์๋์ผ๋ก ํด๊ฒฐํ๊ฒ ํด์ฃผ๋ ์ฅ์ ์ด ์๋ OSIV์ ๋ต์ ์ ๊ฒฝ๊ณ ๋ฅผ ์ค๊น?
OSIV ์ ๋ต์ ํธ๋์ญ์
์์์ฒ๋ผ ์ต์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
์์ ์์ ์์ API ์๋ต์ด ๋๋ ๋ ๊น์ง ์์์ฑ ์ปจํ
์คํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
์ ์ ์งํ๋ค. ๊ทธ๋์ View Template์ด๋ API ์ปจํธ๋กค๋ฌ์์ ์ง์ฐ ๋ก๋ฉ์ด ๊ฐ๋ฅํ๋ค.
์ง์ฐ ๋ก๋ฉ์ ์์์ฑ ์ปจํ
์คํธ๊ฐ ์ด์์์ด์ผ ๊ฐ๋ฅํ๊ณ , ์์์ฑ ์ปจํ
์คํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
์ ์ ์งํ๋ค. ์ด๊ฒ ์์ฒด๊ฐ ํฐ ์ฅ์ ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ด์ ๋ต์ ๋๋ฌด ์ค๋์๊ฐ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์ค์๊ฐ ํธ๋ํฝ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ์ปค๋ฅ์
์ด ๋ชจ์๋ ์ ์๋ค. ์ด๊ฒ์ ๊ฒฐ๊ตญ ์ฅ์ ๋ก ์ด์ด์ง๋ค.
์๋ฅผ ๋ค์ด์ ์ปจํธ๋กค๋ฌ์์ ์ธ๋ถ API๋ฅผ ํธ์ถํ๋ฉด ์ธ๋ถ API ๋๊ธฐ ์๊ฐ ๋งํผ ์ปค๋ฅ์
๋ฆฌ์์ค๋ฅผ ๋ฐํํ์ง ๋ชปํ๊ณ , ์ ์งํด์ผ ํ๋ค. -> OISV์ ์น๋ช
์ ์ธ ๋จ์ , ์ปค๋ฅ์
์ ์์์ฑ ์ปจํ
์คํธ๊ฐ ์ข
๋ฃ๋ ๋๊น์ง 1:1๋ก ๊ณ์ ๋ฌผ๊ณ ์๋ค.
[ OSIV OFF ]
- spring.jpa.open-in-view: false (OSIV ์ข ๋ฃ)
OSIV๋ฅผ ๋๋ฉด ํธ๋์ญ์ ์ ์ข ๋ฃํ ๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ซ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ๋ ๋ฐํํ๋ค. ๋ฐ๋ผ์ ์ปค๋ฅ์ ๋ฆฌ์์ค๋ฅผ ๋ญ๋นํ์ง ์๋๋ค. OSIV๋ฅผ ๋๋ฉด ๋ชจ๋ ์ง์ฐ๋ก๋ฉ์ ํธ๋์ญ์ ์์์ ์ฒ๋ฆฌํด์ผ ํ๋ค. ๋ฐ๋ผ์ ์ง๊ธ๊น์ง ์์ฑํ ๋ง์ ์ง์ฐ ๋ก๋ฉ ์ฝ๋๋ฅผ ํธ๋์ญ์ ์์ผ๋ก ๋ฃ์ด์ผ ํ๋ ๋จ์ ์ด ์๋ค. ๊ทธ๋ฆฌ๊ณ view template์์ ์ง์ฐ๋ก๋ฉ์ด ๋์ํ์ง ์๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก ํธ๋์ญ์ ์ด ๋๋๊ธฐ ์ ์ ์ง์ฐ ๋ก๋ฉ์ ๊ฐ์ ๋ก ํธ์ถํด ๋์ด์ผ ํ๋ค.
# ์ปค๋งจ๋์ ์ฟผ๋ฆฌ ๋ถ๋ฆฌ
์ค๋ฌด์์ OSIV๋ฅผ ๋ ์ํ๋ก ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๋ ์ข ์ ๋ฐฉ๋ฒ์ด ์๋ค. ๋ฐ๋ก Command์ Query๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
๋ณดํต ๋น์ฆ๋์ค ๋ก์ง์ ํน์ ์ํฐํฐ ๋ช ๊ฐ๋ฅผ ๋ฑ๋กํ๊ฑฐ๋ ์์ ํ๋ ๊ฒ์ด๋ฏ๋ก ์ฑ๋ฅ์ด ํฌ๊ฒ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ณต์กํ ํ๋ฉด์ ์ถ๋ ฅํ๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ ํ๋ฉด์ ๋ง์ถ์ด ์ฑ๋ฅ์ ์ต์ ํ ํ๋ ๊ฒ์ด ์ค์ํ๋ค. ํ์ง๋ง ๊ทธ ๋ณต์ก์ฑ์ ๋นํด ํต์ฌ ๋น์ฆ๋์ค์ ํฐ ์ํฅ์ ์ฃผ๋ ๊ฒ์ ์๋๋ค.
๊ทธ๋์ ํฌ๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ๋ค๋ฉด, ์ด ๋์ ๊ด์ฌ์ฌ๋ฅผ ๋ช
ํํ๊ฒ ๋ถ๋ฆฌํ๋ ์ ํ์ ์ ์ง๋ณด์ ๊ด์ ์์ ์ถฉ๋ถํ ์๋ฏธ ์๋ค.
์)
OrderService
- OrderService : ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง
- OrderQueryService : ํ๋ฉด์ด๋ API์ ๋ง์ถ ์๋น์ค (์ฃผ๋ก ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์ ์ฌ์ฉ)
๋ณดํต ์๋น์ค ๊ณ์ธต์์ ํธ๋์ญ์ ์ ์ ์งํ๋ค. ๋ ์๋น์ค ๋ชจ๋ ํธ๋์ญ์ ์ ์ ์งํ๋ฉด์ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ ์ ์๋ค.
# OSIV ์ ๋ฆฌ
ํน์ง
- OSIV๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์์ฑํด์ ์์ฒญ์ด ๋๋ ๋๊น์ง ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ ์งํ๋ค. ํ์ฌ ํ ๋ฒ ์กฐํ๋ ์ํฐํฐ๋ ์์ฒญ์ด ๋๋ ๋๊น์ง ์์ ์ํ๋ฅผ ์ ์งํ๋ค.
- ์ํฐํฐ ์์ ์ ํธ๋์ญ์ ์ด ์๋ ๊ณ์ธต์์๋ง ๋์ํ๋ค. ํธ๋์ญ์ ์ด ์๋ ํ๋ ์ ํ ์ด์ ๊ณ์ธต์ ์ง์ฐ ๋ก๋ฉ์ ํฌํจํด ์กฐํ๋ง ํ ์ ์๋ค.
๋จ์
- ์์์ฑ ์ปจํ ์คํธ์ DB ์ปค๋ฅ์ ์ 1:1๋ก ๋ฌผ๊ณ ์๋ ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ ํ๋ ์ ํ ์ด์ ๋ก์ง๊น์ง DB ์ปค๋ฅ์ ์์์ ๋ญ๋นํ๊ฒ ๋จ.
- OSIV๋ฅผ ์ ์ฉํ๋ฉด ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๊ณต์ ํ๊ฒ๋ ์๋ ์๋ค.
- ํ๋ ์ ํ ์ด์ ์์ ์ํฐํฐ๋ฅผ ์์ ํ๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ฉด ์ํฐํฐ๊ฐ ์์ ๋ ์ ์๋ค.
- ํ๋ ์ ํ ์ด์ ๊ณ์ธต์์ ๋ ๋๋ง ๊ณผ์ ์์ ์ง์ฐ ๋ก๋ฉ์ ์ํด SQL์ด ์คํ๋๋ค. ๋ฐ๋ผ์ ์ฑ๋ฅ ํ๋์์ ํ์ธํด์ผ ํ ๋ถ๋ถ์ด ๋์ด์ง๋ค.
# 0430 - DAU, PU, PV
# DAU / WAU / MAU
1์ผ, 1์ฃผ, 1๋ฌ ๋์ ํ์ฑ ์ฌ์ฉ์(Active User)์ ์๋ฅผ ์๋ฏธ
# DAU (Daily)
- ํ๋ฃจ ๋์ ๋ฐฉ๋ฌธํ ์์ ์ฌ์ฉ์ ์๋ฅผ ์ง๊ณ
- ๊ฒ์, ๋ฉ์ ์ ๋ฑ ์ฌ์ฉ๋น๋๊ฐ ๋์ ์ฑ์ ์ฃผ์ ์งํ๋ก ํ์ฉ๋จ
- ์๋ฒ ๋ถํ๋ฅผ ๋น๋กฏํ ํธ๋ํฝ ๊ด๋ จ ๋ณ๋๋น ์ถ์ ๋ฐ ์ต์ ํ์ ์ฐ๊ด์ด ๊น์
# WAU (Weekly Active User)
- ์ผ์ฃผ์ผ(7์ผ) ๋์ ๋ฐฉ๋ฌธํ ์์ ์ฌ์ฉ์ ์๋ฅผ ์ง๊ณ
- ๋งค์ผ ์ ์ํ ํ์ ์๋ ๋ชจ๋ฐ์ผ ์ํ๊ณผ ๊ฐ์ ์ฑ์์ ์ฃผ๋ก ํ์ฉ๋๋ ์งํ
# MAU (Monthly Active User)
- ์ ๊ฐ(30์ผ) ๋ฐฉ๋ฌธํ ์์ ์ฌ์ฉ์ ์๋ฅผ ์ง๊ณ
- ์์น๊ฐ ํฌ๊ธฐ ๋๋ฌธ์ ๋น์ฆ๋์ค๋ฅผ ์ค๋ช ํ๋ ๋ฐ์ ์ฃผ๋ก ์ธ์ฉ๋จ
- ํ์ง๋ง ์ค์ ์ ์ธ ์ ์ ์ ํ์ฑํ ์ ๋๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ค์ด ๋จ์ ์ด ์์
# PU / ARPU / ARPPU
# PU (Paying Users)
- ์ ๋ฃ ์ ์ ์ (๊ฒฐ์ ํ ์ ์ ์)
# ARPU (Average Revenue Per Users)
- ์ ์ ๋ณ ํ๊ท ๋งค์ถ
- ARPU = ์ด๋งค์ถ/์ด ์ ์ ์
- ์ฝ๊ฒ ๋งํด '๊ฐ๋จ๊ฐ', ํ ๋ช ์ ์ ์ ๊ฐ ํ๊ท ์ผ๋ง๋ฅผ ์ง์ถํ๋์ง ์ ์ ์๋ ์งํ
# ARPPU (Average Revenue Per Paying Users)
- ์ ๋ฃ ์ ์ ๋ณ ํ๊ท ๋งค์ถ
- ARPPU = ์ด๋งค์ถ/์ด ์ ๋ฃ ์๋น์ค ๊ตฌ๋งค ์ ์
- ์ฝ๊ฒ ๋งํด '๊ฒฐ์ ์ ๊ฐ๋จ๊ฐ', ํ ๋ช ์ ์ ๋ก ์ ์ ๊ฐ ํ๊ท ์ผ๋ง๋ฅผ ์ง์ถํ๋์ง ์ ์ ์๋ ์งํ
# Entrance, PV, UV
# Entrance (๋ฐฉ๋ฌธ ์)
- ์น ์ฌ์ดํธ ๋ฐฉ๋ฌธ์์ ์ดํ๊น์ง ์ํํ๋ ํตํฉ ๋จ์
# PV (Page View)
- ์ฌ์ดํธ ์์์ ํ์ด์ง๋ฅผ ์กฐํํ ํ์
ex) 1๋ช
์ด ๋ธ๋ก๊ทธ ๊ธ 2๊ฐ๋ฅผ ์ฝ๋๋ค๋ฉด?
= PV๋ 2๋ก ์ง๊ณ
# UV (Unique Visitors)
- ์๋ฐฉ๋ฌธ์. ์ต์ด ์ธ์ ์ ์ผ์ผํจ ๋ฐฉ๋ฌธ์
- ์นํ์ด์ง์ ๋ฐฉ๋ฌธํ ์ฌ๋์ ์ ์๋ฏธ
- ์ผ๋ฐ์ ์ผ๋ก IP๋ฅผ ๊ธฐ์ค์ผ๋ก, 30๋ถ ๋จ์๋ก ์ชผ๊ฐ์ ๊ณ์ฐ
ex) 1๋ช
์ด ๋ธ๋ก๊ทธ ๊ธ์ ์ฌ๋ฌ๋ฒ ๋ณธ๋ค๋ฉด?
= UV๋ 1๋ก ์ง๊ณ
ex) 1๋ช
์ด ๋ธ๋ก๊ทธ ๊ธ์ ์ฝ๊ณ , 30๋ถ ๋ค์ ํ ๋ฒ ๋ ๋ณธ๋ค๋ฉด?
= UV๋ 2๋ก ์ง๊ณ
# 0501 - Spring Bean vs Static method ์ธ์ ์ด๋๊ฑธ ์ฌ์ฉํด์ผํ ๊น?
๋จผ์ ์ฌ๊ธฐ์ ๋งํ๋ static ํจ์ ๋ชจ์ class๋ Apache Commons Lang StringUtils (opens new window)์ฒ๋ผ ์์ ํ static ํจ์๋ง์ ๊ฐ์ง๊ณ ์๊ณ , ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ์ฌ์ฉํ๋ ํด๋์ค๋ฅผ ์๋ฏธํ๋ค.
static ํจ์ ๋ชจ์ ํด๋์ค์ ๋ชจ๋ ํจ์๋ ์ธ์๊ฐ ๋์ผํ ๊ฒฝ์ฐ ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํด์ผ ํ๋ค. ์ด๊ท์น์ ์งํฌ ์ ์์ผ๋ฉด POJO Bean์ผ๋ก ๋ง๋ค๋ผ.
์ด๊ฒ์ด ์ด๋ค์ง๋ ค๋ฉด ํจ์ ์์์๋ ์ธ๋ถ ์์(Resource)์ ๋ํด ํ๋๋ ์์กดํ๋ฉด ์๋๋ค๋ ์ ๊ฒฐ ์กฐ๊ฑด์ ์ถฉ์กฑํด์ผ ํ๋ค. ์ธ๋ถ ์์์ ๊ทธ ์คํ ๊ฒฐ๊ณผ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ ๊ฐ์ฅ ์ ๋ค์ด๋ง๋ ์๋ StringUtils (opens new window), CollectionUtils (opens new window) ๊ฐ์ ๊ฒ๋ค์ด๋ค.