1018 - 1024
# 1018 - 1024
# 1018 - JUnit์ assertThat, assertj์ assertThat
ํ
์คํธ ์ฝ๋๋ ํฌ๊ฒ ์คํ ๋จ๊ณ
, ๊ฒ์ฆ ๋จ๊ณ
๋ก ๋๋ ์ ์๋ค.
- ์คํ ๋จ๊ณ์์๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ชจ๋ฐฉํ์ฌ ํ ์คํธํ ๋ก์ง์ ์คํ
- ๊ฒ์ฆ ๋จ๊ณ์์๋ ์คํ ๋จ๊ณ๊ฐ ์์ํ ๋๋ก ๋์ํ๋์ง ๊ฒ์ฆ JUnit์์ ๊ฒ์ฆ ๋จ๊ณ๋ฅผ ๋์์ฃผ๋ ๋ฉ์๋๊ฐ ๋ฐ๋ก assertThat์ด๋ผ๋ ๋ฉ์๋๋ค.
# org.junit.Assert.assertThat
public static <T> void assertThat(T actual, Matcher<? super T> matcher)
- org.junit.Assert.assertThat์ ๊ธฐ๋ณธ ํํ
- actual ์ธ์์ ๊ฒ์ฆ๋์(์คํ ๋จ๊ณ์ ๊ฒฐ๊ณผ)์ ๋ฃ๊ณ , ์ด์ ๋น๊ตํ๋ ๋ก์ง(matcher)์ ์ฃผ์ ๋ฐ์ ๊ฒ์ฆ ๋จ๊ณ๋ฅผ ์ํํ๋ค.
๊ฐ๋ฐ์๊ฐ matcher๋ฅผ ์ง์ ๊ตฌํํ๋๊ฒ์ ๋นํจ์จ์ ์ด๊ณ , ๊ตฌํํ matcher์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ๋ ์๋ค. matcher์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํ ์คํธ๊ฐ ์คํจํ๋๋ฐ, ์ธ๋ถ ์์ธ์ ์ํฅ์ ๋ฐ๋ ๊ฒ์ ์ข์ ํ ์คํธ๋ผ๊ณ ํ ์ ์๋ค. ๋ฐ๋ผ์ JUnit์ assertThat์ hamcrest์ ๊ตฌํ๋ matcher์ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํ๊ณ ์๋ค.
# org.junit.Assert.assertThat ์์ ์ฝ๋
- 0๋ณด๋ค ์ปค์ผํ๋ค
import static org.junit.Assert.assertThat;
import static org.hamcrest.Matchers.greaterThan;
...
@Test
public void number_test() throws Exception {
int number = 3;
int result = mathService.add(number, 3);
assertThat(result, greaterThan(0));
}
- 0๋ณด๋ค ํฌ๊ณ 10๋ณด๋ค๋ ์์ผ์ผ ํ๋ค.
import static org.junit.Assert.assertThat;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.lessThan;
import static org.hamcrest.core.AllOf.allOf;
...
@Test
public void number_test() throws Exception {
int number = 3;
int result = mathService.add(number, 3);
assertThat(result, allOf(
greaterThan(0),
lessThan(10)
));
}
# org.junit.Assert.assertThat ๋จ์
์๋์์ฑ
allOf, greaterThan, lessThan ๋ฑ์ ๋ฉ์๋๋ค์ ๋ฏธ๋ฆฌ import ํด๋์ง ์์ผ๋ฉด, IDE์์ ์๋์์ฑ์ ํด์ฃผ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ํ์ํ ๋ฉ์๋๋ฅผ ๊ณต์๋ฌธ์์์ ์ฐพ๊ฑฐ๋, ์ด๋ฆ์ ์ธ์์ ์์ฑํด์ผ ํ๋ค.Assertion ๋ถ๋ฅ(matcher)
์ ๋ก์ง์์๋ int ํ์ ์ ๋ํ matcher๋ง ํ์ํ๋ฐ, org.hamcrest.Matchers ํด๋์ค์๋ ์ฌ๋ฌ ํ์ ์ ๋ํ matcher๊ฐ ํจ๊ป ๋ค์ด์๋ค. ๊ทธ๋์ ์ํ๋ matcher๋ฅผ ์ฐพ๊ธฐ๊ฐ ํ๋ค๋ค.ํ์ฅ์ฑ
์ถ๊ฐ๋ ์กฐ๊ฑด๋ ๊ฐ์ด ๊ฒ์ฆํ๊ธฐ ์ํด์ allOf๋ผ๋ ๋ฉ์๋๋ก ๊ธฐ์กด ์กฐ๊ฑด๊ณผ ๋ฌถ์ด์ค์ผ ํ๋ค. assertj์์๋ ์ด๋ฐ ๋ถํธํจ์ ํด๊ฒฐํ๊ณ ๋ฉ์๋ ์ฒด์ด๋ ํจํดํ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ ์ฑ์ ํฅ์์ํจ assertThat์ ์ ๊ณตํ๋ค.
# org.assertj.core.api.Assertions.assertThat
public static AbstractAssert<SELF, T> assertThat(T actual)
- assertj์ assertThat์ ์ธ์๋ก actual(๊ฒ์ฆ๋์)๋ง ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ actual์ ํ์ ์ ๋ฐ๋ผ AbstractAssert๋ผ๋ ์ถ์ํด๋์ค๋ฅผ ์์ํ Assert ์์ํ Assert ํด๋์ค๋ฅผ ๋ฐํํ๋ค.
public static AbstractIntegerAssert<?> assertThat(int actual)
public static AbstractDateAssert<?> assertThat(Date actual)
public static AbstractUriAssert<?> assertThat(URI actual)
ํ์ ์ ๋ฐ๋ผ ๊ฐ Assert ํด๋์ค๋ฅผ ๋ฐํํ๊ณ ๊ฐ ํด๋์ค๋ค์ ํ์ ์ ๋ง๋ Assertion ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
- AbstractIntegerAssert (java.long.Integer)
- isGreaterThan(int other)
- isLessThan(int other)
- ...
- AbstractDateAssert (java.util.Date)
- hasTime(long timestamp)
- hasYear(int year)
- isAfter(Date other)
- isBefore(Date other)
- ...
- AbstractUriAssert (java.net.URI)
- hasNoParameters()
- hasNoQuery()
- hasNoPort()
- ...
=> ๊ฐ Assertion ๋ฉ์๋๋ ๋ฐํ ํ์ ์ด SELF ์ด๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ ์ฒด์ด๋ ํจํด์ผ๋ก ํ ์คํธ ๋ก์ง์ ์์ฑํ ์ ์๋ค.
# org.assertj.core.api.Assertions.assertThat ์์ ์ฝ๋
import static org.assertj.core.api.Assertions.assertThat;
...
@Test
public void number_test() throws Exception {
int number = 3;
int result = mathService.add(number ,3);
assertThat(result)
.isGreaterThan(0)
.isLessThan(10);
}
# ์ ๋ฆฌ
JUnit, AssertJ๊ฐ ์ ๊ณตํ๋ assertThat ๋ฉ์๋๋ฅผ ๋น๊ตํ ๊ฒฐ๊ณผ ์๋์์ฑ, Assertion๋ถ๋ฅ, ํ์ฅ์ฑ ์ธ๊ฐ์ง์ ์ด์ ๋ก AssertJ์ assertThat์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค.
# 1019 - ์ ์ ๋ฉค๋ฒ static (์ ์ ํค์๋)
# static ํค์๋
ํด๋์ค ๋ฉค๋ฒ(๋ณ์, ๋ฉ์๋)์ ๋ถ์ด๋ ํค์๋
๋ฉค๋ฒ๋ณ์๋ ํด๋์ค๊ฐ ๊ฐ์ฒด๋ก ์์ฑ๋ ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉํ์ง๋ง, static ํค์๋๊ฐ ๋ถ์ ๋ฉค๋ฒ๋ ํ๋ก๊ทธ๋จ์ด ์คํ ๋ ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋๋ค.
ํด๋์ค ๋ฉค๋ฒ์ด๊ธด ํ์ง๋ง ์๊ธฐ๊ฐ ๋ก๋๋๊ธฐ ์ํ ๊ณต๊ฐ์ผ๋ก์จ๋ง ํด๋์ค์์ ์ ์ธํ๋ ์๋ฏธ๊ฐ ์๋ค.
- ๋ฉค๋ฒ๋ณ์
- ๋ฉค๋ฒ ๋ฉ์๋
- ๋ฉ์๋ ๋ด์์ ์ฌ์ฉ ๋ถ๊ฐ
# ๋ฉค๋ฒ๋ณ์
- static ๋ณ์, ์ ์ ๋ณ์, ๊ณต์ฉ๋ณ์
- ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ๋ฐ๋ก
ํด๋์ค๋ช .๋ฉ์๋()
๋๋ํด๋์ค๋ช .๋ณ์๋ช
์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.- Util Class : java.uitl.Math
- ๋ฉค๋ฒ๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ์ ํ๋ฒ ํ ๋น๋์ด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋ ํด์ ๋๋ ๋ณ์๋ก, ๋ฉ๋ชจ๋ฆฌ์ ํ๋ฒ ํ ๋น๋๋ฏ๋ก ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ค.
- ๋ฉค๋ฒ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฉ์๋ ๋ํ ๋ฉค๋ฒ ๋ฉ์๋๋ก ์ ์ธ๋์ด์ผ ํ๋ค.
# ์ฌ์ฉ
- static ๋ณ์ : ์ผ๋ฐ์ ์ผ๋ก ์์๋ค๋ง ๋ชจ์์ ์ฌ์ฉํ๋ฉฐ ์์์ ๋ณ์๋ช ์ ๋๋ฌธ์์ _๋ฅผ ์กฐํฉํ์ฌ ์ด๋ฆ์ง๊ณ , ๋ํ ์์์ ๋ฐฉ์งํ๊ธฐ ์ํด final class๋ก ์ ์ธ์ ํ๋ค.
- static ๋ฉ์๋ : ์์์ ๋ฐฉ์งํ๊ธฐ ์ํด final class๋ก ์ ์ธ์ ํ๊ณ , ์ ํธ ๊ด๋ จ๋ ํจ์๋ค์ ๋ชจ์๋๋ค.
# 1020 - ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค(isolation level)
# ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค์ด๋?
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค(isolation level)์ด๋ ๋์์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ์ฒ๋ฆฌ๋ ๋, ํธ๋์ญ์ ๋ผ๋ฆฌ ์ผ๋ง๋ ์๋ก ๊ณ ๋ฆฝ๋์ด ์๋์ง๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด๋ค.
์ฆ, ๊ฐ๋จํ๊ฒ ๋งํด ํน์ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋ณ๊ฒฝํ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๋๋ก ํ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ACID ํน์ง๊ณผ ๊ฐ์ด ํธ๋์ญ์ ์ด ๋ ๋ฆฝ์ ์ธ ์ํ์ ํ๋๋ก Locking์ ํตํด, ํธ๋์ญ์ ์ด DB๋ฅผ ๋ค๋ฃจ๋ ๋์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ด์ฌํ์ง ๋ชปํ๋๋ก ๋ง๋ ๊ฒ์ด ํ์ํ๋ค.
ํ์ง๋ง ๋ฌด์กฐ๊ฑด Locking์ผ๋ก ๋์์ ์ํ๋๋ ์๋ง์ ํธ๋์ญ์ ๋ค์ ์์๋๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๊ฒ ๋๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๋ฅ์ ๋จ์ด์ง๊ฒ ๋๋ค. ํ์ง๋ง, ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด Locking์ ๋ฒ์๋ฅผ ์ค์ธ๋ค๋ฉด, ์๋ชป๋ ๊ฐ์ด ์ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ ํ ์ ์๋ค.
๋ฐ๋ผ์ ์ต๋ํ ํจ์จ์ ์ธ Locking ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
# Lock
- Lock : ํธ๋์ญ์
์ฒ๋ฆฌ์ ์์ฐจ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ฐฉ๋ฒ(๋์์ฑ ์ ์ด)
DBMS ๋ง๋ค Lock์ ๊ตฌํํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ DBMS๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ด์ฉํ๊ธฐ ์ํด์ ํด๋น DB์ Lock์ ๋ํ ์ดํด๊ฐ ์๊ตฌ๋๋ค.- ๊ณต์ (shared) lock : ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ์ฌ์ฉ๋์ด ์ง๋ lock.
- ๊ณต์ ๋ฝ์ ๊ณต์ ๋ฝ๋ผ๋ฆฌ ๋์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง, ๊ณต์ ๋ฝ์ด ์ค์ ๋ ๋ฐ์ดํฐ์ ๋ฐฐํ๋ฝ์ ์ฌ์ฉํ ์๋ ์๋ค.
- ๋ฐฐํ(Exclusive) lock : ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ํ ๋ ์ฌ์ฉ๋๋ฉฐ, ํธ๋์ญ์
์ด ์๋ฃ๋ ๋๊น์ง ์ ์ง๋๋ค.
- Lock์ด ํด์ ๋ ๋๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ (์ฝ๊ธฐ ํฌํจ)์ ํด๋น ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ค.
- ํด๋น Lockdms ํธ๋์ญ์ ์ด ์ํ๋๊ณ ์๋ ๋ฐ์ดํฐ์ ๋ํด์๋ ์ ๊ทผํ์ฌ ํจ๊ผ Lock์ ์ค์ ํ ์ ์๋ค.
- ๊ณต์ (shared) lock : ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ์ฌ์ฉ๋์ด ์ง๋ lock.
# ๊ฒฉ๋ฆฌ ์์ค
- READ UNCOMMITTED (๋ ๋ฒจ 0)
- SELECT ๋ฌธ์ฅ์ด ์ํ๋๋ ๋์ ํด๋น ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ์ง ์๋ ๊ณ์ธต
- ํธ๋์ญ์ ์ ์ฒ๋ฆฌ์ค์ด๊ฑฐ๋, ์์ง Commit๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๋ ๊ฒ์ ํ์ฉํจ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํจ
- Dirty Read ๋ฐ์ => ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ฌธ์ ๋ฐ์
- READ COMMITTED (๋ ๋ฒจ 1)
- SELECT ๋ฌธ์ฅ์ด ์ํ๋๋ ๋์ ํด๋น ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ๋ ๊ณ์ธต
- ํธ๋์ญ์ ์ด ์ํ๋๋ ๋์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ ๊ทผํ ์ ์์ด ๋๊ธฐํ๊ฒ ๋จ
- Commit์ด ์ด๋ฃจ์ด์ง ํธ๋์ญ์ ๋ง ์กฐํ ๊ฐ๋ฅ
- Non-Repeatable Read ๋ฐ์
- REPEATABLE READ (๋ ๋ฐ 2)
- ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง SELECT ๋ฌธ์ฅ์ด ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ๋ ๊ณ์ธต
- ํธ๋์ญ์ ์ด ๋ฒ์ ๋ด์์ ์กฐํํ ๋ฐ์ดํฐ ๋ด์ฉ์ด ํญ์ ๋์ผํจ์ ๋ณด์ฅํจ
- ๋ค๋ฅธ ์ฌ์ฉ์๋ ํธ๋์ญ์ ์์ญ์ ํด๋น๋๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ๋ถ๊ฐ๋ฅ
- Non-Repeatable Read ๋ถ์ ํฉ์ด ๋ฐ์ํ์ง ์์
- ์์ ์ ํธ๋์ญ์ ๋ฒํธ๋ณด๋ค ๋ฎ์ ํธ๋์ญ์ ๋ฒํธ์์ ๋ณ๊ฒฝ๋(์ปค๋ฐ๋) ๊ฒ๋ง ๋ณด๊ฒ ๋๋ค.
- Phantom Read ๋ฐ์
- SERIALIZABLE (๋ ๋ฐ 3)
- ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง SELECT ๋ฌธ์ฅ์ด ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ๋ ๊ณ์ธต
- ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก ์๋ฒฝํ ์ฝ๊ธฐ ์ผ๊ด์ฑ ๋ชจ๋๋ฅผ ์ ๊ณตํจ
- ๋ค๋ฅธ ์ฌ์ฉ์๋ ํธ๋์ญ์ ์์ญ์ ํด๋น๋๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ๋ฐ ์ ๋ ฅ ๋ถ๊ฐ๋ฅ
์๋๋ก ๋ด๋ ค๊ฐ์๋ก ํธ๋์ญ์
๊ฐ ๊ณ ๋ฆฝ ์ ๋๊ฐ ๋์์ง๋ฉฐ, ์ฑ๋ฅ์ด ๋จ์ด์ง๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
์ผ๋ฐ์ ์ธ ์จ๋ผ์ธ ์๋น์ค์์๋ READ COMMITTED
๋ REPEATABLE READ
์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ค.
(oracle = READ COMMITTED, mysql = REPEATABLE READ)
# ์ ํ ์ ๊ณ ๋ ค์ฌํญ
Isolation Level์ ๋ํ ์กฐ์ ์, ๋์์ฑ๊ณผ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ฐ๊ด๋์ด ์๋ค.
๋์์ฑ์ ์ฆ๊ฐ์ํค๋ฉด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ , ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ฉด ๋์์ฑ์ด ๋จ์ด์ง๊ฒ ๋๋ค.
=> ํธ๋ ์ด๋ ์คํ
# 1022 - ์ด๋ถ ํ์
- ์ด์ง ํ์(์ด๋ถ ํ์) ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ ฌ๋์ด ์๋ ๋ฆฌ์คํธ์์ ํ์ ๋ฒ์๋ฅผ ์ ๋ฐ์ฉ ์ขํ๊ฐ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ด์ง ํ์์ ๋ฐฐ์ด ๋ด๋ถ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์์ด์ผ๋ง ์ฌ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ๋ณ์ 3๊ฐ(start, end, mid)๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ๋ค. ์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ์ ์ค๊ฐ์ ์์น์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋น๊ตํด์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ฒ์ด ์ด์ง ํ์์ ๊ณผ์ ์ด๋ค.
- ์๊ฐ ๋ณต์ก๋๋ O(logN) ์ด๋ค.
# ์๋ฐ ๊ตฌํ
- ์ผ๋ฐ์ ์ธ ์ด๋ถ ํ์ ๊ตฌํ
private static boolean find(int num, int[] arr) {
// left
int l = 0;
// right
int r = arr.length-1;
while(l <= r) {
int mid = (l+r) / 2;
if(arr[mid] == num) {
return true;
} else if (arr[mid] > num) {
r = mid-1;
} else {
l = mid+1;
}
}
return false;
}
- Lower Bound, Upper Bound ๊ตฌํ
private static int lowerBound(int num){
int l = 0;
int r = arr.length;
while(l<r){
int mid = (l+r)/2;
if(arr[mid] >= num){
r = mid;
} else {
l = mid + 1;
}
}
return l;
}
private static int upperBound(int num){
int l = 0;
int r = arr.length;
while(l<r){
int mid = (l+r)/2;
if(arr[mid] <= num){
l = mid + 1;
} else {
r = mid;
}
}
return l;
}
# 1023 - [๋ฐฑ์๋ ๊ธฐ๋ณธ]๋ฒ์ ๊ด๋ฆฌ ์์คํ ๊ณผ ๋ฒ์ ๊ด๋ฆฌ ์นํธ์คํ ์๋น์ค ๊ฒฐ์
# ๋ฒ์ ๊ด๋ฆฌ ์์คํ
- ์ฌ์ฉ์ด์ : ์์คํ ์ ๋์์ ๋ฐ์ ํ์ ์ ์ํ์ด ํ๋ ๊ฒ
- ๋ณ๊ฒฝ์ ์ฝ๊ฒ ๋๋๋ฆด ์ ์๋ค.
- git, svn, mercurial
# ๋ฒ์ ๊ด๋ฆฌ ์นํธ์คํ ์๋น์ค
- ์ฝ๋๋ฅผ ์ ์ฅํ ์๋ฒ
- hook์ ํตํด ํ ์คํธ์คํ ๋ฐ ์๋ํ ๋ฐฐํฌ
- pull request
- github, gitlab, bitbucket
- github : ์ด์ ํธ๋์ปค(GitHub Issues), Projects, ZenHubํ๋ฌ๊ทธ์ธ
- ํน์ ๋ธ๋์น๋ฅผ ํฅํ pull request์ ๋ํด n๊ฐ ์ด์์ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์์ผ mergeํ ์ ์๋ ๊ธฐ๋ฅ
- Organization์์ ํ์ ๋ง๋ค์ด ์ฌ์ฉ์๋ฅผ ํฌํจ์ํค๊ณ , ํ๋จ์๋ก ์ ์ฅ์์ ๊ฐ๊ฐ์ read/write/admin ๊ถํ๋ถ์ฌ, ์๋ธ ํ์ ๋ง๋ค์ด ๋ ์ธ๋ถ์ ์ธ ์๊ณ
# Git GUI
- github desktop
- source tree
- gitkraken
# 1024 - [๋ฐฑ์๋ ๊ธฐ๋ณธ]๊ฐ๋ฐ ํ๋ก์ธ์ค ์ ๋ฆฝ
# ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ ๋ฆฝ์ด๋?
- ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ ์ด๋ป๊ฒ ์ด์๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ด๋ค ๋ฐฉ์์ผ๋ก ์์
์ ์งํํ๊ณ , ์๋ฃ๋ ์์
์ ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณ์ ์ค์ ์ ํ์ ๋ฐ์์ํฌ์ง์ ๊ฐ์ ๊ฒ๋ค์ ๊ท์นํ ์ํจ ๊ฒ์ด๋ค.
- ์์ ๋ค์ด ์ด๋ค ์ํ์ธ์ง(์ค๋น ์ค/์งํ ์ค/์๋ฃ)
- ์ด์๋ฅผ ์ค์ ๋ก ์ฒ๋ฆฌํ๋ ์ ์ฅ์์, ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ๋ฐ๋ผ ์์ ์ ์งํํ๋ฉด ์ด๋ ๋ธ๋์น์์ ์ด๋ค ์ด๋ฆ์ผ๋ก ๋ธ๋์น๋ฅผ ์์ฑํ ์ง/์ด๋ ๋ธ๋์น๋ก pull request๋ฅผ ์ฌ๋ฆฌ๋ฉฐ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์์ผ ํ ์ง/master merge ํ ์ด๋ค ํ์ ์์ ์ ์งํํด์ผ ํ๋์ง์ ๊ฐ์ ๊ณ ๋ฏผ์ ์ค์ผ ์ ์๋ฐ. ์ค์ ๋ก ์์ฑํ๋ ์ฝ๋์๋ง ์ง์คํ๋ ํ๊ฒฝ์ ๋ง๋ค ์ ์๋ค.
- ์ ์ ๋ฆฝ๋ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ ์์ฐ์ฑ์ ๋์ด๋ ๊ฒ์ ๊ธฐ์ฌํ๋ฉฐ, ์์ ์ ์งํ์ ๋งค๋๋ฝ๊ฒ ๋ง๋ค๊ณ , ๊ฒฐ๊ณผ๋ฌผ์ ํ๋ฆฌํฐ๋ฅผ ๋์ธ๋ค.
# ์ด์ ๊ด๋ฆฌ ๋๊ตฌ
- ์์ ์๋ฅผ assign
- ์ด์์ ๋ํด ์ปค๋ฎค๋์ผ์ด์
- ํ๊ทธ/๋ผ๋ฒจ ๋ฑ์ผ๋ก ์ด์์ ์ข ๋ฅ๋ฅผ ๊ตฌ๋ถ
- ์ด์์ ์ํ๋ฅผ ํตํด ์๊ฐํ
- ๋๋๋ก GitHub ๋ด์์ ํด๊ฒฐ
- Asana, Jira, Trello, GitHub Issues & Projects
- GitHub Issues & Projects
- assign, issue conversation, customized label, filter by label, projects์ issues ์ฐ๋, projects์ automation ๊ธฐ๋ฅ์ ํตํด ์ด์ ๊ตฌ๋ถ๊ณผ ์ด์ ์ํ ์๋ ๊ฐฑ์
- GitHub Issues์์ ์ด์๋ฅผ ๋ฑ๋กํ๋ฉด ํด๋น ์ด์์ ๋ํ ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง๊ณ , ์ปค๋ฐ ๋ฉ์์ง์ #123 ๊ฐ์ด ๋ฒํธ๋ฅผ ๋ช ์์ ๋๋ฉด ์๋์ผ๋ก ํด๋น ์ด์๊ฐ ๋งํฌ
- Projects, Issues