- ์ ๊ณต์ : ์ธํฐํ์ด์ค, ํจํค์ง, ํ๋ ์์ํฌ ๋ฑ ์ ์ฉ์ฑ์ ์ต๋ํ ๋ํ๋ ค ์ ์ด๋ค.
- ๋ ๋ง์ ํ๊ฒฝ์์ ๋์๊ฐ์ผ ๋ ๋ง์ด ๊ตฌ๋งคํ๋๊น
- ์ฌ์ฉ์ : ์์ ์ ์๊ตฌ์ฌํญ์ ์ง์คํ๊ธฐ๋ฅผ ๋ฐ๋๋ค.
์์ ๊ฐ์ ์ ์ฅ์ ์ฐจ์ด๋ก ๊ฒฝ๊ณ์์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๊ธธ ์์ง๊ฐ ๋ง๋ค.
Map์ ๊ต์ฅํ ๋ค์ํ๊ณ ์ ์ฐํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ์๋์ ๊ฐ์ ์ํ์ฑ์ ๊ฐ๋๋ค.
- Map์ด ์ ๊ณตํ๋
clear()
์ ๊ฐ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋๊ตฌ๋ ์ฌ์ฉํ ์ ์๋ค. - ํน์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ๋ก ๊ฒฐ์ ํ๋๋ผ๋, ๊ฐ์ฒด ์ ํ์ ์ ํํ์ง ์๊ธฐ๋๋ฌธ์ ์ด๋ค ์ ํ๋ ์ถ๊ฐํ ์ ์๋ค.
Map sensors = new HashMap();
Sensor s = (Sensor) sensor.get(sensorId); // ํ์ํ ๋๋ง๋ค ๊ณ์ ํ๋ณํ์ ๋ฐ๋ณตํด์ผํจ.
Map์ด ๋ฐํํ๋ Object๋ฅผ ์ฌ๋ฐ๋ฅธ ์ ํ์ผ๋ก ๋ณํํ ์ฑ ์์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ค. ๊ณผ์ฐ ์ด๋ ๊นจ๋ํ ์ฝ๋์ผ๊น?
2๋ฒ ํด๊ฒฐ๋ฒ : Generics๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ์ ์ ํํ๊ณ ์ฝ๋๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
Map<String, Sensor> sensors = new HashMap();
Sensor s = sensor.get(sensorId);
- ํ์ง๋ง 1๋ฒ์ ํด๊ฒฐํ์ง ๋ชปํ๋ค.
1๋ฒ ํด๊ฒฐ๋ฒ : ๊ฒฝ๊ณ ์ธํฐํ์ด์ค๋ฅผ ํด๋์ค ์์ผ๋ก ์จ๊ธด๋ค. => ์ผ๊ธ ์ปฌ๋ ์ (First Class Collection)
์ผ๊ธ ์ปฌ๋ ์ : Collection์ Wrappingํ๋ฉด์, ๊ทธ ์ธ ๋ค๋ฅธ ๋ฉค๋ฒ ๋ณ์๊ฐ ์๋ ์ํ
์ถ์ฒ : ์ผ๊ธ ์ปฌ๋ ์ (First Class Collection)์ ์๊ฐ์ ์จ์ผํ ์ด์
public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id){
return (Sensor) sensors.get(id);
}
}
- Map ์ธํฐํ์ด์ค๊ฐ ๋ณํ๋๋ผ๋ ๋๋จธ์ง ํ๋ก๊ทธ๋จ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
- Sensors ํด๋์ค์์์ ๊ฐ์ฒด ์ ํ์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋์ด์ ์ ๋ค๋ฆญ์ค๋ฅผ ์ฌ์ฉํ๋ ํ์ง ์๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
- ์ฌ์ฉ์์๊ฒ ํ์ํ ์ธํฐํ์ด์ค๋ง ์ ๊ณตํ ์ ์์ผ๋ฏ๋ก, ๊ธฐ๋ฅ์ ์ ํํ๊ณ ๋น์ฆ๋์ค ๊ท์น์ ๊ฐ์ ํ ์ ์๋ค.
๊ฒฐ๋ก
- Map๊ณผ ๊ฐ์ ๊ฒฝ๊ณ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ ๋๋ ์ด๋ฅผ ์ด์ฉํ๋ ํด๋์ค๋ ํด๋์ค ๊ณ์ด ๋ฐ์ผ๋ก ๋ ธ์ถ๋์ง ์๋๋ก ์ฃผ์ํ๋ค.
- ์ฆ, Map์ธ์คํด์ค๋ฅผ ๊ณต๊ฐ API์ ์ธ์๋ก ๋๊ธฐ๊ฑฐ๋ ๋ฐํ๊ฐ์ผ๋ก ์ฌ์ฉํ์ง ์๋๋ค.
์ธ๋ถ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ์๊ฐ์ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ถ์ํ๊ธฐ ์ฌ์์ง์ง๋ง, ์ฌ์ฉ๋ฒ์ ์ตํ๋ ๊ฒ๋ ๊ธฐ์กด ์ฝ๋์ ํตํฉํ๋ ๊ฒ๋ ์ด๋ ต๋ค. ๋๋ก ๊ธฐ์กด ์ฝ๋ ๋ฒ๊ทธ์ธ์ง ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ๊ทธ์ธ์ง ์ฐพ์๋ด๋๋ผ ์ค๋๊ฑธ๋ฆฐ๋ค. ์ด๋ด ๋ ํ์ํ๊ฒ ํ์ตํ ์คํธ ์ด๋ค.
- ํ์ตํ
์คํธ : ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ ค๋ ๋ฐฉ์๋๋ก ํ
์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํด ์ธ๋ถ API๋ฅผ ์ตํ๊ณ ์ดํดํ๋ ๋จ์ ํ
์คํธ
- ์ด๋ค ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๋ ค๋ณด๋๊ฒ.
- ์๋ฐ String ํด๋์ค์ ๋ค์ํ ๋ฉ์๋(ํจ์) ์ฌ์ฉ๋ฒ
public class StringTest {
@DisplayName("split์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ๋๋๋ค.")
@Test
void split_StringArray() {
assertThat("1,2".split(",")).containsExactly("1", "2");
assertThat("1".split(",")).contains("1");
}
@DisplayName("substring์ ์ฌ์ฉํ์ฌ ํน์ ๋ฌธ์์ด์ ์๋ผ๋ธ๋ค.")
@Test
void substring_String_IndexInBounds() {
assertThat("(1,2)".substring(1, 4)).isEqualTo("1,2");
}
@DisplayName("charAt์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด ๊ธธ์ด ๋ฒ์ ๋ด ์ธ๋ฑ์ค๋ฅผ ์ ๋ฌํ์ฌ ํน์ ์์น ๋ฌธ์๋ฅผ ๊ฐ์ ธ์จ๋ค.")
@Test
void charAt_Char_IndexInBounds() {
String result = "abc";
assertThat(result.charAt(0)).isEqualTo('a');
assertThat(result.charAt(1)).isEqualTo('b');
assertThat(result.charAt(2)).isEqualTo('c');
}
@DisplayName("charAt ์ฌ์ฉ์ ๋ฌธ์์ด ๊ธธ์ด ๋ฒ์๋ฅผ ๋๋ ์ธ๋ฑ์ค๋ฅผ ์ ๋ฌํ๋ฉด StringIndexOutOfBoundsException์ด ๋ฐ์ํ๋ค.")
@Test
void charAt_ThrowsException_IndexOutOfBounds() {
String result = "abc";
assertThatThrownBy(() -> {
result.charAt(3);
}).isInstanceOf(StringIndexOutOfBoundsException.class)
.hasMessageContaining("String index out of range: " + 3);
assertThatThrownBy(() -> {
result.charAt(-1);
}).isInstanceOf(StringIndexOutOfBoundsException.class)
.hasMessageContaining("String index out of range: " + -1);
}
}
- ์๋ฐ Set์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ, ์์ , ์ญ์ ํ๋ ๋ฐฉ๋ฒ
public class SetTest {
private Set<Integer> numbers;
@BeforeEach
void setUp() {
numbers = new HashSet<>();
numbers.add(1);
numbers.add(1);
numbers.add(2);
numbers.add(3);
}
@DisplayName("Set์ ํฌ๊ธฐ๋ฅผ ํ์ธํ๋ค.")
@Test
void hasSize_True_InputSetSize() {
assertThat(numbers).hasSize(3);
}
@DisplayName("Set์ ํน์ ๊ฐ ์กด์ฌ๋ฅผ ํ์ธํ๋ค. (ValueSource ํ์ฉ ํ
์คํธ)")
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void contains_True_ExistingValue(int input) {
assertThat(numbers).contains(input);
}
@DisplayName("Set์ ํน์ ๊ฐ ์กด์ฌ๋ฅผ ํ์ธํ๋ค. (CsvSource ํ์ฉ ํ
์คํธ)")
@ParameterizedTest
@CsvSource(value = {"1:true", "2:true", "3:true", "4:false", "5:false"}, delimiter = ':')
void contains_TrueOrFalse_ExistingOrNonExistingValue(int input, boolean expected) {
assertThat(numbers.contains(input)).isEqualTo(expected);
}
}
์ฝ๋ ์ถ์ฒ : nextstep - tdd ๊ฐ์ ๋ฏธ์ step1
์ฌ์ฉ๋ฒ์ ์ตํ์ผ๋ ๋ ์์ ์ธ ํด๋์ค๋ก ์บก์ํํ๋ค. ๊ทธ๋ฌ๋ฉด ๋๋จธ์ง ํ๋ก๊ทธ๋จ์ ๊ฒฝ๊ณ ์ธํฐํ์ด์ค๋ฅผ ๋ชฐ๋ผ๋ ๋๋ค.
- ํ์ต ํ ์คํธ๋ ํ์ํ ์ง์์ ํ๋ณดํ ์ ์์ ๋ฟ ์๋๋ผ, ํจํค์ง ์ ๋ฒ์ ์ด ๋์จ๋ค๋ฉด ์ด๋ฅผ ๋๋ ค ์ฐจ์ด๋ฅผ ํ์ธํ๊ณ ์ฐ๋ฆฌ ์ฝ๋์ ํธํ๋๋์ง ๊ฒ์ฆํ ์ ์๋ค.
- ๋ง์ฝ ์ด๋ฐ ๊ฒฝ๊ณํ ์คํธ๊ฐ ์๋ค๋ฉด ์ ๋ฒ์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ด ์ฌ์์ง๋ฉฐ, ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ก์ ๋ฒ์ ์ ํ์ ์ด์์ผ๋ก ์ค๋ ์ฌ์ฉํ๋ ค๋ ์ ํน์ ๋น ์ง๊ธฐ ์ฝ๋ค.
- ์ฆ, ํ์ต ํ ์คํธ๋ ํฌ์ํ๋ ๋ ธ๋ ฅ๋ณด๋ค ์ป๋ ์ฑ๊ณผ๊ฐ ๋ ํฌ๋ค.
๊ฒฝ๊ณ์ ๊ด๋ จํด ๋ ๋ค๋ฅธ ์ ํ์ ์๋ ์ฝ๋์ ๋ชจ๋ฅด๋ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒฝ๊ณ๋ค.
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค๋ณด๋ฉด, ์์ง ๊ฐ๋ฐ๋์ง ์์ ๋ชจ๋์ API๋ฅผ ์ฌ์ฉํด์ผํ๋ ๊ฒฝ๊ณ๋ฅผ ๋ง๋ ๋๊ฐ ์๋ค. ์ด๋ด ๋, ๊ฐ๋ฐ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ณด๋ค ์์ฒด์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ค.
- ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉด ์ธํฐํ์ด์ค๋ฅผ ์ ์ ์ผ๋ก ํต์ ํ๋ค๋ ์ฅ์ ์ด ์๊ธด๋ค. โก๏ธ
Transmitter
- ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ธฐ๋๋ฌธ์ ํด๋น ๋ชจ๋์ ์ฌ์ฉํ๋ ์ฝ๋๋ ๊น๋ํ๊ฒ ์์ฑ๊ฐ๋ฅํ๋ค. โก๏ธ
Communication Controller
- ํด๋น ๋ชจ๋์ API๊ฐ ๊ฐ๋ฐ๋ ํ์, Adapter๋ฅผ ๊ตฌํํด ๊ฐ๊ทน์ ๋งค์ธ ์ ์๋ค. โก๏ธ
Transmitter Adapter
- ์ด๋ํฐ ํจํด์ผ๋ก API ์ฌ์ฉ์ ์บก์ํํด API๊ฐ ๋ฐ๋ ๋ ์์ ํ ์ฝ๋๋ฅผ ํ๊ณณ์ ๋ชจ์ ์ ์๋ค.
- ์ ์ ํ Fakeํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด, ํด๋น ๋ชจ๋์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ํ
์คํธ ํ ์ ์๋ค. โก๏ธ
Fake Transmitter
- ๋ชจ๋ API ์ธํฐํ์ด์ค๊ฐ ๋์จ ๋ค์์ ๊ฒฝ๊ณ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํด API๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋์ง ํ ์คํธํ ์ ์๋ค.
์ด๋ํฐ ํจํด ๊ณต๋ถ ํ์
๊ฒฝ๊ณ์์๋ ๋ณ๊ฒฝ์ด ๋ง์ด ์ผ์ด๋๋๋ฐ, ์ํํธ์จ์ด ์ค๊ณ๊ฐ ์ฐ์ํ๋ค๋ฉด ๋ณ๊ฒฝํ๋๋ฐ ์์ฒญ๋ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ์๊ตฌํ์ง ์๋๋ค. ์์๊ฐ์ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํด ์๋ ๊ท์น์ ์ง์ผ๋ณด์.
1.๊ฒฝ๊ณ์ ์์นํ๋ ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ์.
2.๊ธฐ๋์น๋ฅผ ์ ์ํ๋ ํ ์คํธ์ผ์ด์ค๋ฅผ ์์ฑํ์.
- ํ ์คํธ์ผ์ด์ค ์์ฑ ์ ์ธ๋ถ ํจํค์ง๋ฅผ ์ธ์ธํ๊ฒ ์ ํ์๊ฐ ์๋ค.
- ์ฆ, ์ธ๋ถ ํจํค์ง๋ฅผ ์์กดํ๊ธฐ ๋ณด๋ค ํต์ ๊ฐ๋ฅํ ์ฐ๋ฆฌ์ฝ๋์ ์์กดํ์.
3.์ธ๋ถ ํจํค์ง๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ฅผ ๊ฐ๋ฅํ ์ค์ฌ ๊ฒฝ๊ณ๋ฅผ ๊ด๋ฆฌํ์.
- ์๋ก์ด ํด๋์ค๋ก ๊ฒฝ๊ณ๋ฅผ ๊ฐ์ธ๊ฑฐ๋ ์ด๋ํฐ ํจํด์ ์ฌ์ฉํ์ฌ, ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ธ๋ถ์ ๊ณต ์ธํฐํ์ด์ค๋ก ๋ณํํ์.
์ด๋ ๋ฐฉ๋ฒ์ด๋ ์ฝ๋ ๊ฐ๋ ์ฑ์ด ๋์์ง๋ฉฐ, ๊ฒฝ๊ณ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ผ๊ด์ฑ๋ ๋์์ง๊ณ , ์ธ๋ถ ํจํค์ง๊ฐ ๋ณํ์ ๋ ๋ณ๊ฒฝํ ์ฝ๋๋ ์ค์ด๋ ๋ค.