1010 ~ 1016
# 1010 ~ 1016
# 1011 - ์์ฑ์ ๋ฐ์ธ๋ฉ(Constructor Binding)๋ก ํ๋กํผํฐ(Properties) ์ค์ ๊ฐ ๋ถ๋ฌ์ค๊ธฐ
# [ ์์ฑ์๋ก ๋ฐ์ธ๋ฉํ๊ธฐ(@ConstructorBinding) ]
- ์ค์ ํ์ผ
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=h2test
spring.datasource.password=h2test
- ์์์๋ฅผ ์ด์ฉํด properties์ ๊ฐ์ ๋ฐ์ธ๋ฉํ๋๋ก @ConstructorBinding ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐ
@Getter
@RequiredArgsConstructor
@ConfigurationProperties(prefix = "spring.datasource")
@ConstructorBinding
public class DataSourceProperties {
private final String driverClassName;
private final String url;
private final String username;
private final String password;
}
# 1012 - ๋ถ๋ณ ๊ฐ์ฒด(Immutable Object) ๋ฐ final์ ์ฌ์ฉํด์ผ ํ๋ ์ด์
# 1. ๋ถ๋ณ ๊ฐ์ฒด(Immutable Object) ๋ฐ final์ ์ฌ์ฉํด์ผ ํ๋ ์ด์
# [ ๋ถ๋ณ ๊ฐ์ฒด(Immutable Object)๋? ]
๋ถ๋ณ ๊ฐ์ฒด๋ ๊ฐ์ฒด ์์ฑ ์ดํ ๋ด๋ถ์ ์ํ๊ฐ ๋ณํ์ง ์๋ ๊ฐ์ฒด์ด๋ค. ๋ถ๋ณ ๊ฐ์ฒด๋ read-only ๋ฉ์๋๋ง์ ์ ๊ณตํ๋ฉฐ, ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๋ฅผ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ง ์๊ฑฐ๋ ๋ฐฉ์ด์ ๋ณต์ฌ(defensive-copy)๋ฅผ ํตํด ์ ๊ณตํ๋ค. Java์ ๋ํ์ ์ธ ๋ถ๋ณ ๊ฐ์ฒด๋ก๋ String์ด ์๋ค.
String name = "Old";
name.toCharArray()[0] = 'E';
Java์ String์ ๋ถ๋ณ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ด String ๋ด๋ถ์ charํ ๋ฐฐ์ด์ ์ป์ด ์์ ํ์ฌ๋ ๋ฐ์๋์ง ์๋๋ค. Java์์๋ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด ๋ฑ์ ์ฐธ์กฐ(Reference)๋ฅผ ์ ๋ฌํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ๋ฅผ ํตํด ๊ฐ์ ์์ ํ๋ฉด ๋ด๋ถ์ ์ํ๊ฐ ๋ณํ๊ธฐ ๋๋ฌธ์ ๋ด๋ถ๋ฅผ ๋ณต์ฌํ์ฌ ์ ๋ฌํ๊ณ ์๋๋ฐ, ์ด๋ฅผ ๋ฐฉ์ด์ ๋ณต์ฌ(defensive-copy)๋ผ๊ณ ํ๋ค. String์ toCharArray๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณต์ฌํ์ฌ ์ ๋ฌํ๊ณ ์๋ค.
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
# [ ๋ถ๋ณ ๊ฐ์ฒด ๋ฐ final์ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ]
Thread-Safeํ์ฌ ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ฉํ๋ฉฐ, ๋๊ธฐํ๋ฅผ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค.
- ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ ๊ณต์ ์์์ ๋์์ ์ฐ๊ธฐ(Write) ๋๋ฌธ์ด๋ค. ํ์ง๋ง ๋ง์ฝ ๊ณต์ ์์์ด ๋ถ๋ณ์ด๋ผ๋ฉด ํญ์ ๋์ผํ ๊ฐ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋๊ธฐํ๋ฅผ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค. ์ด๋ ์์ ์ฑ์ ๋ณด์ฅํ ๋ฟ๋ง ์๋๋ผ ๋๊ธฐํ๋ฅผ ํ์ง ์์์ผ๋ก์จ ์ฑ๋ฅ์์ ์ด์ ๋ ๊ฐ์ ธ๋ค์ค๋ค.
์คํจ ์์์ ์ธ(Failure Atomic) ๋ฉ์๋๋ฅผ ๋ง๋ค ์ ์๋ค.
- ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ํตํด ์์ ์ ํ๋ ๋์ค ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ๊ฐ์ฒด๊ฐ ๋ถ์์ ํ ์ํ์ ๋น ์ง ์ ์๊ณ , ๋ถ์์ ํ ์ํ๋ฅผ ๊ฐ๋ ๊ฐ์ฒด๋ ๋ ๋ค๋ฅธ ์๋ฌ๋ฅผ ์ ๋ฐํ ์ ์๋ค. ํ์ง๋ง ๋ถ๋ณ ๊ฐ์ฒด๋ผ๋ฉด ์ด๋ ํ ์์ธ๊ฐ ๋ฐ์ํ์ฌ๋ ๋ฉ์๋ ํธ์ถ ์ ์ ์ํ๋ฅผ ์ ์งํ ์ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์์ธ๊ฐ ๋ฐ์ํ์ฌ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ ์ฒ๋ผ ๋ค์ ๋ก์ง์ ์ฒ๋ฆฌํ ์ ์๋ค.
Cache๋ Map ๋๋ Set ๋ฑ์ ์์๋ก ํ์ฉํ๊ธฐ์ ๋์ฑ ์ ํฉํ๋ค.
- ๋ง์ฝ ์บ์๋ Map, Set ๋ฑ์ ์์์ธ ๊ฐ๋ณ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋์๋ค๋ฉด ์ด๋ฅผ ๊ฐฑ์ ํ๋ ๋ฑ์ ๋ถ๊ฐ ์์ ์ด ํ์ํ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ถ๋ณ ๊ฐ์ฒด๋ผ๋ฉด ํ ๋ฒ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์ดํ์ ๋ค๋ฅธ ์์ ๋ค์ ๊ณ ๋ คํ์ง ์์๋ ๋๋ฏ๋ก ์ฌ์ฉํ๋๋ฐ ์ฉ์ดํ๊ฒ ์์ฉํ ๊ฒ์ด๋ค.
๋ถ์ ํจ๊ณผ(Side Effect)๋ฅผ ํผํด ์ค๋ฅ๊ฐ๋ฅ์ฑ์ ์ต์ํํ ์ ์๋ค.
- ๋ถ์ ํจ๊ณผ๋ ๋ณ์์ ๊ฐ์ด๋ ์ํ ๋ฑ์ ๋ณํ๊ฐ ๋ฐ์ํ๋ ํจ๊ณผ๋ฅผ ์๋ฏธํ๋ค. ๋ง์ฝ ๊ฐ์ฒด์ ์์ ์(Setter)๋ฅผ ํตํด ์ฌ๋ฌ ๊ฐ์ฒด๋ค์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ค๋ฉด ๊ฐ์ฒด์ ์ํ๋ฅผ ์์ธกํ๊ธฐ ์ด๋ ค์์ง ๊ฒ์ด๋ค. ๋ฐ๋ ์ํ๋ฅผ ํ์ ํ๊ธฐ ์ํด์๋ ๋ฉ์๋๋ค์ ์ดํด๋ณด์์ผ ํ๊ณ , ์ด๋ ์ ์ง๋ณด์์ฑ์ ์๋นํ ๋จ์ด๋จ๋ฆฐ๋ค. ๊ทธ๋์ ์ด๋ฌํ ๋ถ์ํจ๊ณผ๊ฐ ์๋ ์์ ํจ์๋ค์ ๋ง๋๋ ๊ฒ์ด ์๋นํ ์ค์ํ๋ค. ๋ถ๋ณ ๊ฐ์ฒด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ์์ ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์ ์ผ๋ฉฐ, ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ฌ์ฉ์ด ์๋นํ ์ ํ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๋ค์ ์์ฐ์ค๋ฝ๊ฒ ์์ ํจ์๋ค๋ก ๊ตฌ์ฑ๋ ๊ฒ์ด๊ณ , ๋ค๋ฅธ ๋ฉ์๋๊ฐ ํธ์ถ๋์ด๋ ๊ฐ์ฒด์ ์ํ๊ฐ ์ ์ง๋๊ธฐ ๋๋ฌธ์ ์์ ํ๊ฒ ๊ฐ์ฒด๋ฅผ ๋ค์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฌํ ๋ถ๋ณ ๊ฐ์ฒด๋ ์ค๋ฅ๋ฅผ ์ค์ฌ ์ ์ง๋ณด์์ฑ์ด ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ๋์์ค ๊ฒ์ด๋ค.
๋ค๋ฅธ ์ฌ๋์ด ์์ฑํ ํจ์๋ฅผ ์์ธก๊ฐ๋ฅํ๋ฉฐ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐ์ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ํ์ ์ ํ๊ฒ ๋๋ค. ๋ถ๋ณ์ฑ(Immutability)์ ํ์ ๊ณผ์ ์์๋ ๋์์ ์ฃผ๋๋ฐ, ๋ถ๋ณ์ฑ์ด ๋ณด์ฅ๋ ํจ์๋ผ๋ฉด ๋ค๋ฅธ ์ฌ๋์ด ๊ฐ๋ฐํ ํจ์๋ฅผ ์ํ์์ด ์ด์ฉํ ์ ์๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค๋ฅธ ์ฌ๋๋ ๋ด๊ฐ ์์ฑํ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ๋, ๊ฐ์ด ๋ณํ์ง ์์์ ๋ณด์ฅ๋ฐ์ ์ ์๋ค. ๊ทธ๋ ๊ธฐ์ ์ฐ๋ฆฌ๋ ๋ณ๊ฒฝ์ ๋ํ ๋ถ์์์ด ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ์ด์ฉํ ์ ์๋ค. ๋ํ ๋ถํ์ํ ์๊ฐ์ ์ ์ฝํ ์๋ ์๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฑ๋ฅ์ ๋์ผ ์ ์๋ค.
- ๋ถ๋ณ์ฑ์ ๋ง์ ์ด์ ์ค์์ ๋ง์ ์ฌ๋๋ค์ด ๋์น๋ ๊ฒ์ด ๋ฐ๋ก GC์ฑ๋ฅ์ ๋์ฌ์ค๋ค๋ ๊ฒ์ด๋ค. ๋ถ๋ณ์ ๊ฐ์ฒด๋ ํ๋ฒ ์์ฑ๋ ์ดํ์ ์์ ์ด ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด๋ก, Java์์๋ final ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ณ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค. ์ด๋ ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๋ ๋ ๋ค๋ฅธ ์ปจํ
์ด๋ ๊ฐ์ฒด(ImmutableHolder)๋ ์กด์ฌํ๋ค๋ ๊ฒ์ธ๋ฐ, ๋น์ฐํ ๋ถ๋ณ์ ๊ฐ์ฒด(Object value)๊ฐ ๋จผ์ ์์ฑ๋์ด์ผ ์ปจํ
์ด๋ ๊ฐ์ฒด๊ฐ ์ด๋ฅผ ์ฐธ์กฐํ ์ ์์ ๊ฒ์ด๋ค. ์ฆ, ์ปจํ
์ด๋๋ ์ปจํ
์ด๋๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฅ ์ ์ ๊ฐ์ฒด๋ค๋ณด๋ค ๋ ์ ๋ค๋ ๊ฒ(๋ฆ๊ฒ ์์ฑ๋์๋ค๋ ๊ฒ)์ด๋ค. ์ด๋ฅผ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- Object ํ์ ์ value ๊ฐ์ฒด ์์ฑ
- ImmutableHolder ํ์ ์ ์ปจํ ์ด๋ ๊ฐ์ฒด ์์ฑ
- ImmutableHolder๊ฐ value ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
์ด๋ฌํ ์ ์ GC๊ฐ ์ํ๋ ๋, ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ปจํ ์ด๋ ๊ฐ์ฒด ํ์์ ๋ถ๋ณ ๊ฐ์ฒด๋ค์ Skipํ ์ ์๋๋ก ๋์์ค๋ค. ์๋ํ๋ฉด ํด๋น ์ปจํ ์ด๋ ๊ฐ์ฒด๊ฐ ์ด์์๋ค๋ ๊ฒ์ ํ์์ ๋ถ๋ณ ๊ฐ์ฒด๋ค(value) ์ญ์ ์ฒ์์ ํ ๋น๋ ์ํ๋ก ์ฐธ์กฐ๋๊ณ ์์์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ด๋ค.
public class MutableHolder {
private Object value;
public Object getValue() { return value; }
public void setValue(Object o) { value = o; }
}
public class ImmutableHolder {
private final Object value;
public ImmutableHolder(Object o) { value = o; }
public Object getValue() { return value; }
}
@Test
public void createHolder() {
// 1. Object ํ์
์ value ๊ฐ์ฒด ์์ฑ
final String value = "MangKyu";
// 2. Immutable ์์ฑ ๋ฐ ๊ฐ ์ฐธ์กฐ
final ImmutableHolder holder = new ImmutableHolder(value);
}
๊ฒฐ๊ตญ ๋ถ๋ณ์ ๊ฐ์ฒด๋ฅผ ํ์ฉํ๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ค์บํด์ผ ๋๋ ๊ฐ์ฒด์ ์๊ฐ ์ค์ด์ ์ค์บํด์ผ ํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ๊ณผ ๋น๋์ ์ญ์ ์ค์ด๋ค ๊ฒ์ด๊ณ , GC๊ฐ ์ํ๋์ด๋ ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๋๊ฐ์ ์์ ํ ์ ์๋ MutableHolder๋ณด๋ค๋ ํ๋๊ฐ์ ์์ ํ ์ ์๋ ImmutableHolder๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
# 2. Java์์ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฒ
# [ final ํค์๋ ]
final String name = "Old";
name = "New"; // ์ปดํ์ผ ์๋ฌ
final List<String> list = new ArrayList<>();
list.add("a"); // ๊ฐ๋ฅ
- ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๋ถ๋ณ ํด๋์ค๋ก ์์ฑํด์ผํจ
# [ ๋ถ๋ณ ํด๋์ค ์์ ]
Java์์ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ผ์ ํด๋์ค๋ฅผ ์์ฑํ๋ค.
- ํด๋์ค๋ฅผ final๋ก ์ ์ธํ๋ผ
- ๋ชจ๋ ํด๋์ค ๋ณ์๋ฅผ private์ final๋ก ์ ์ธํ๋ผ
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ์์ฑ์ ๋๋ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ผ
- ์ฐธ์กฐ์ ์ํด ๋ณ๊ฒฝ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ ๋ฐฉ์ด์ ๋ณต์ฌ๋ฅผ ์ด์ฉํ์ฌ ์ ๋ฌํ๋ผ
public final class ImmutableClass {
private final int age;
private final String name;
private final List<String> list;
private ImmutableClass(int age, String name) {
this.age = age;
this.name = name;
this.list = new ArrayList<>();
}
public static ImmutableClass of(int age, String name) {
return new ImmutableClass(age, name);
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public List<String> getList() {
return Collections.unmodifiableList(list);
}
}
ํด๋์ค๋ค์ ๊ฐ๋ณ์ ์ด์ฌ์ผ ํ๋ ๋งค์ฐ ํ๋นํ ์ด์ ๊ฐ ์์ง ์๋ ํ ๋ฐ๋์ ๋ถ๋ณ์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ค. ๋ง์ฝ ํด๋์ค๋ฅผ ๋ถ๋ณ์ผ๋ก > ๋ง๋๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ฉด, ๊ฐ๋ฅํ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ต์ํํ๋ผ. - Effective Java -
# 1013 - @ConfigurationPropertiesScan
@EnableConfigurationProperties์ ๋ฑ๋กํด์ผ ํ๋ ํด๋์ค๋ค์ด ๋ง์ ๊ฒฝ์ฐ์๋ ์ผ์ผ์ด ๋ฑ๋กํ๋๊ฒ ๋ฒ๊ฑฐ๋ก์ธ ์ ์๋ค.
# [ @EnableConfigurationProperties์ ํ๊ณ์ ]
@EnableConfigurationProperties๋ฅผ ์ด์ฉํด ์ค์ ํ๋กํผํฐ ํด๋์ค(@Configuration Properties)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํด๋น ํด๋์ค๋ค์ด ๋ง์์ง ๊ฒฝ์ฐ์ ์ฝ๋๊ฐ ์๋นํ ๋ฌด๊ฑฐ์์ง๋ ํ๊ณ๊ฐ ์๋ค.
@Configuration
@EnableConfigurationProperties({DataSourceProperties.class, InfluxProperties.class, ...})
public class SpringBootApplication {
}
SpringBoot 2.2๋ถํฐ๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด @ConfigurationPropertiesScan ์ด๋ผ๋ ์ด๋ ธํ ์ด์ ์ ์ ๊ณตํ๊ณ ์๋ค.
# [ @ConfigurationPropertiesScan์ ์ฌ์ฉ๋ฒ ]
@ConfigurationPropertiesScan ์ด๋
ธํ
์ด์
์ @ComponentScan๊ณผ ์๋นํ ์ ์ฌํ๋ค.
@ConfigurationPropertiesScan ์ด๋
ธํ
์ด์
์ ํจํค์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก @ConfigurationProperties๊ฐ ๋ฑ๋ก๋ ํด๋์ค๋ค์ ์ฐพ์ ๊ฐ๋ค์ ์ฃผ์
ํ๊ณ ๋น์ผ๋ก ๋ฑ๋กํด์ค๋ค. @ConfigurationPropertiesScan์ ์ค์บ์ ์คํํ ํจํค์ง ๋๋ ํด๋์ค๋ฅผ ์ง์ ํด์ค ์ ์์ผ๋ฉฐ, ๋ง์ฝ ๋ณ๋๋ก ์ง์ ํ์ง ์๋๋ค๋ฉด ํด๋น ์ด๋
ธํ
์ด์
์ด ๋ถ์ ํจํค์ง์ ๊ทธ ํ์ ํจํค์ง์ ๋ํด ์ค์บ์ ์งํํ๋ค. @Component๋ ๊ทธ ํ์ ์ด๋
ธํ
์ด์
(@Configuration ๋ฑ)์ด ๋ถ์ ํด๋์ค๋ค์ @ConfigurationPropertiesScan์ ์ํด ์ค์บ๋์ง ์๋๋ค.
์ผ๋ฐ์ ์ผ๋ก Spring Boot์ ๋ฉ์ธ ํด๋์ค์ @ConfigurationPropertiesScan ์ด๋
ธํ
์ด์
์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํด์ฃผ๊ณ , ํ์ํ ๊ฒฝ์ฐ Base Package๋ฅผ ์ง์ ํด์ค๋ค.
@Configuration
@ConfigurationPropertiesScan("com.mang.atdd.membership")
public class SpringBootApplication {
}
# 1015 - ์ธ๋ฑ์ค ์์ฑ์ ๋ต
# [ ์ธ๋ฑ์ค ์ ์ ๊ธฐ์ค ]
- ๋ชจ๋ ์ก์ธ์ค ํํ์ ๋ถ์์ ํ ๋๋ก์ด์์ ์ธ ์ปฌ๋ผ ๊ตฌ์ฑ๊ณผ ์์ ๊ฒฐ์ ์ ํตํด ์ต์์ ์ธ๋ฑ์ค๋ก ๋ชจ๋ ์ก์ธ์ค ํํ๋ฅผ ๋ง์กฑํ ์ ์๋๋ก ํด์ผํ๋ค.
- ๊ฐ๋ฅํ ์ค์ธก์๋ฃ(์ก์ธ์ค ํํ ์์ง, ๋ถ์, ์ก์ธ์ค์ ๋น๋, ์ฒ๋ฆฌ๋ฒ์์ ํฌ๊ธฐ, ๋ถํฌ๋, ํ ์ด๋ธ์ ํฌ๊ธฐ, ์ก์ธ์ค ์ ํ ๋ฑ)๋ฅผ ํ์ฉํ์ฌ ์ข ํฉ์ ์ผ๋ก ์ ๋ต์ ์ธ ๊ฒฐ์ ์ ํด์ผํ๋ค.
- ์ฌ๊ธฐ์ ๋ถํฌ๋๋ ์ฝ๊ฒ ๋งํด ์ฌ์ฉ ๋น๋๋ก ์ดํด๋ฅผ ํ๋ฉด ๋๋ค. ์ฆ, ๋ถํฌ๋๊ฐ ์ข๋ค๋ ์๋ฏธ๋ ํ ์ปฌ๋ผ์ ํด๋นํ๋ ๊ฐ์ด ํฌ์์ฑ์ด ๋๋ค๋ ๋ป์ด๋ค.
# [ ์ ์ฅ์ฉ ๋ํ ํ ์ด๋ธ ์ ์ฉ ๊ธฐ์ค ]
- ๋ก๊ทธ์ฑ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ๋ชฉ์ ์ผ๋ก ์์ฑ๋ ํ ์ด๋ธ์ ์ ์ฅ์ฉ ๋ํ ํ ์ด๋ธ์ด๋ผ๊ณ ํ๋ค.
- ์ด๋ฌํ ํ ์ด๋ธ์ ํน์ง์ผ๋ก๋ ๋๋์ ๋ฐ์ดํฐ๊ฐ ์ง์์ ์ผ๋ก ์ ๋ ฅ์ด ๋๋ค๋ ๊ฒ์ด๋ค.
- ๋ฐ๋ผ์ ํ ์ด๋ธ์์ ๊ธฐ๋ณธํค(PK)๋ฅผ ๊ฐ์ง๋ ๊ฒ์ ์ ๋ ฅ์ ๋ถ๋ด์ด ๋ ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ๋ ๊ณ ๋ คํด์ผ ํ๋ค. ๋์ UNIQUE INDEX ์์ฑ์ ๊ณ ๋ คํด์ผ ํ๋ค.
- ๋ํ, ํ ์ด๋ธ์ ํํฐ์ ์ ๋ง๋ค๊ณ ํํฐ์ ๋ง๋ค ํ์ํ ์ธ๋ฑ์ค๋ฅผ(Local Index)๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข๋ค.
- ํํฐ์ ์ธ๋ฑ์ค ์ฌ์ฉ์, ์ฌ์ฉ ํํฐ์ ์ ์ธ๋ฑ์ค๋ง ์ฌ์ฉํ๋ ๊ฒ๋ ๊ณ ๋ คํด์ผ ํ๋ค. => ์ฆ, ์ ์ฒด Local Index๋ฅผ UNUSABLE ์ํ๋ก ๋ง๋ ํ, ์ดํ ํ์ํ ํํฐ์ ์ ์ธ๋ฑ์ค๋ง ์์ฑํ๋ ๋ฐฉ์
# [ Composite index (๊ฒฐํฉ ์ธ๋ฑ์ค) ]
- ์ฌ๋ฌ ์ปฌ๋ผ์ ๋ชจ์ ํ๋์ ์ธ๋ฑ์ค๋ก ๋ง๋๋ ๋ฐฉ์. ์ฃผ๋ก SQL ๋ฌธ์ฅ์์ WHERE ์ ์ ์กฐ๊ฑด ์ปฌ๋ผ์ด 2๊ฐ ์ด์์ AND๋ก ์ฐ๊ฒฐ ๋์ด ํจ๊ป ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์ ๋ง์ด ์ฌ์ฉ.
- ๋จ, OR๋ก ์กฐํ๋๋ ๊ฒฝ์ฐ๋ ๊ฒฐํฉ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๋ฉด ์๋๋ค.
- ํน์ง
- ์ธ๋ฑ์ค์ ์ฒซ ๋ฒ์งธ ์ปฌ๋ผ์ด ์กฐ๊ฑด์ ์ ์๋ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ์ธ๋ฑ์ค๊ฐ ์ฌ์ฉ๋์ง ์๋๋ค.
- Equal ์ฐ์ฐ์ด ์๋ ๊ฒ์ ์กฐ๊ฑด์ด ๋ค์ด์ค๋ ๊ฒฝ์ฐ(๋ฒ์ ์ฐ์ฐ), ์ฒ๋ฆฌ ๋ฒ์๊ฐ ํฌ๊ฒ ์ฆ๊ฐํ์ฌ ํจ์จ์ด ํฌ๊ฒ ์ ํ๋ ์ ์๋ค.
- ์ธ๋ฑ์ค์ ์ฒซ ๋ฒ์งธ ์ปฌ๋ผ์ด ์กฐ๊ฑด์ ์ ์๋ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ์ธ๋ฑ์ค๊ฐ ์ฌ์ฉ๋์ง ์๋๋ค.
# [ ๊ฒฐํฉ ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ ์ปฌ๋ผ์ ์์ ]
์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด์๋ ๊ฒฐํฉ ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ ์ปฌ๋ผ์ ๋ฐ๋์ ๋ค์์ ์์์ ๋ง๋๋ก ์์ฑํด์ผ ํ๋ค.
- 1์์ : ์ปฌ๋ผ์ด ์ฌ์ฉํ ์ฐ์ฐ์์ ์ํ ์ธ๋ฑ์ค ์ปฌ๋ผ ์ ์
- 2์์ : ๋๋ค ์ก์ธ์ค๋ฅผ ๊ณ ๋ คํ ์ธ๋ฑ์ค ์ปฌ๋ผ ์ ์
- 3์์ : ์ ๋ ฌ ์ ๊ฑฐ๋ฅผ ์ํ ์ธ๋ฑ์ค ์ปฌ๋ผ ์ ์
- 4์์ : ๋จ์ผ ์ปฌ๋ผ์ ๋ถํฌ๋๋ฅผ ๊ณ ๋ คํ ์ธ๋ฑ์ค ์ปฌ๋ผ ์ ์
์ ์ฐ์ ์์๋ฅผ ์งํค์ง ์๋๋ค๋ฉด ์ ๋น์ด ํด๋น ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ๊ธฐ ์กฐ์ฐจ ํ๋ค๋ค.
์์ 1
SELECT ์นด๋๋ฒํธ, ์ฌ์ฉ๊ธ์ก FROM ๊ฑฐ๋๋ด์ญ WHERE ์นด๋๋ฒํธ = '111' AND ๊ฑฐ๋์ผ์ BETWEEN '20080501' AND '20080510';
- ์นด๋๋ฒํธ ์ปฌ๋ผ์ ๋ถํฌ๋๋ ๋งค์ฐ ์ข์ผ๋ฉฐ ๊ฑฐ๋์ผ์ ์ปฌ๋ผ์ ๋ถํฌ๋๋ ๋งค์ฐ ์ข์ง ์๋ค. ์นด๋๋ฒํธ, ๊ฑฐ๋์ผ์ ์์ผ๋ก ๊ฒฐํฉ ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ์๋, ์นด๋๋ฒํธ ์ปฌ๋ผ์ ๊ฐ์ ์ํด ์ฒ๋ฆฌ ๋ฒ์๋ ๊ฐ์ํ๊ฒ ๋๋ฉฐ ๋ํ ๊ฑฐ๋์ผ์ ์ปฌ๋ผ์ ์ํด์๋ผ๋ ์ฒ๋ฆฌ ๋ฒ์๊ฐ ๊ฐ์ํ๊ฒ ๋๋ฏ๋ก ์ํ๋ ๋ฐ์ดํฐ์ ๋ํด ์ต์์ ์ก์ธ์ค๋ก ๊ฒฐ๊ณผ๋ฅผ ์ถ์ถํ ์ ์๊ฒ ๋๋ค.
์์ 2
SELECT ์นด๋๋ฒํธ, ์ฌ์ฉ๊ธ์ก FROM ๊ฑฐ๋๋ด์ญ WHERE ์นด๋๋ฒํธ BETWEEN '111' AND '555' AND ๊ฑฐ๋์ผ์ = '20080515';
- ์ปฌ๋ผ์ ๋ถํฌ๋๋ง์ ์๊ฐํ์ฌ ์นด๋๋ฒํธ + ๊ฑฐ๋์ผ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ค๋ฉด ์นด๋๋ฒํธ ์ปฌ๋ผ์ ์ํด์๋ง ์ฒ๋ฆฌ ๋ฒ์๊ฐ ๊ฐ์ํ๊ฒ ๋์ด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ค.
- ๊ทธ ์ด์ ๋ 111 ์นด๋๋ฒํธ๋ถํฐ 555 ์นด๋๋ฒํธ๊น์ง 2008๋ 5์ 15์ผ ๋ฐ์ดํฐ๋ง์ ์ก์ธ์คํ๋ ๊ฒ์ด ์๋๋ผ '111' ์นด๋๋ฒํธ๋ถํฐ '555'์นด๋ ๋ฒํธ๊น์ง ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ก์ธ์คํ๊ธฐ ๋๋ฌธ์ด๋ค. => ์ฆ, ๊ฑฐ๋์ผ์ ์ปฌ๋ผ์ ์ฒ๋ฆฌ ์๋ฅผ ๊ฐ์์ํค์ง ๋ชปํ๋ค.
- ๋ฐ๋ผ์ ๊ฒฐํฉ ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฒฐํฉ ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํด์ผ ํ๋ค.
- ์ ์กฐ๊ฑด(=, IN) + ์ ์กฐ๊ฑด(=, IN) : ๋ ์กฐ๊ฑด์ ์ํด ์ฒ๋ฆฌ ๋ฒ์ ๊ฐ์
- ์ ์กฐ๊ฑด(=, IN) + ์ ๋ถ ์กฐ๊ฑด(LIKE, BETWEEN) : ๋ ์กฐ๊ฑด์ ์ํด ์ฒ๋ฆฌ ๋ฒ์ ๊ฐ์
- ์ ๋ถ ์กฐ๊ฑด(LIKE, BETWEEN) + ์ ๋ถ ์กฐ๊ฑด(LIKE, BETWEEN) : ์์ ์ ๋ถ ์กฐ๊ฑด์ ์ํด ์ฒ๋ฆฌ ๋ฒ์ ๊ฐ์
- ์ ๋ถ ์กฐ๊ฑด(LIKE, BETWEEN) + ์ ์กฐ๊ฑด(=, IN) : ์์ ์ ๋ถ ์กฐ๊ฑด์ ์ํด์๋ง ์ฒ๋ฆฌ ๋ฒ์ ๊ฐ์
: ๋ฐ๋ผ์ ์์ ๊ฐ์ด ์ฐ์ฐ์์ ์ํด ์ฒ๋ฆฌ ๋ฒ์๊ฐ ๊ฒฐ์ ๋๋ฉฐ ์ต์์ ์ฒ๋ฆฌ ๋ฒ์๋ฅผ ๋ณด์ฅ๋ฐ๊ธฐ ์ํด์๋ ์ ์กฐ๊ฑด ์์ ์ ๋ถ ์กฐ๊ฑด์ด ์กด์ฌํ๋ฉด ์๋๋ค.