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์—์„œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์— ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  1. ํด๋ž˜์Šค๋ฅผ final๋กœ ์„ ์–ธํ•˜๋ผ
  2. ๋ชจ๋“  ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ฅผ private์™€ final๋กœ ์„ ์–ธํ•˜๋ผ
  3. ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ƒ์„ฑ์ž ๋˜๋Š” ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ผ
  4. ์ฐธ์กฐ์— ์˜ํ•ด ๋ณ€๊ฒฝ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ „๋‹ฌํ•˜๋ผ
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) : ์•ž์˜ ์„ ๋ถ„ ์กฐ๊ฑด์— ์˜ํ•ด์„œ๋งŒ ์ฒ˜๋ฆฌ ๋ฒ”์œ„ ๊ฐ์†Œ

: ๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์ด ์—ฐ์‚ฐ์ž์— ์˜ํ•ด ์ฒ˜๋ฆฌ ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋˜๋ฉฐ ์ตœ์†Œ์˜ ์ฒ˜๋ฆฌ ๋ฒ”์œ„๋ฅผ ๋ณด์žฅ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ์  ์กฐ๊ฑด ์•ž์— ์„ ๋ถ„ ์กฐ๊ฑด์ด ์กด์žฌํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

Last update: October 16, 2022 21:47
Contributors: jaesungahn91