0503 - 0509
# 0503 - 0509
# 0503 - git ์๊ฐ์ ๊ฒ
# git ์๊ฐ์ ๊ฒ
# ๋ฒ์ ๊ด๋ฆฌํ๊ธฐ
โ
์ฌ์ฉ์์ ์์ด๋/์ด๋ฉ์ผ์ ์ค์ ํ ์ ์๋๊ฐ?
git config user.name ์์ด๋
git config user.email ์ด๋ฉ์ผ์ฃผ์
-local, -global
โ
์ฌ์ฉ์์ ์์ด๋/์ด๋ฉ์ผ์ ์ญ์ ํ ์ ์๋๊ฐ?
โ
ํด๋น ๋๋ ํ ๋ฆฌ๋ฅผ ๊น ์ ์ฅ์๋ก ๋ง๋ค ์ ์๋๊ฐ?
git init
โ
ํด๋น ๋๋ ํ ๋ฆฌ์ ์ํ๋ฅผ ํ์ธํ ์ ์๋๊ฐ?
git status
โ
๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์๋๊ฐ?
git log
โ
์คํ
์ด์ง์ ํ ์ ์๋๊ฐ?
git add ํ์ผ์ด๋ฆ.ํ์ฅ์
โ
์ปค๋ฐ์ ํ ์ ์๋๊ฐ?
git commit -m "message"
โ
์คํ
์ด์ง๊ณผ ์ปค๋ฐ์ ํ ๋ฒ์ ํ ์ ์๋๊ฐ?
git commit -am "message"
โ
์ปค๋ฐ/์คํ
์ด์ง์ ์ทจ์ํ ์ ์๋๊ฐ?
git reset HEAD^
โ
์์
ํธ๋ฆฌ์์์ ์์ ๋ด์ญ๋ ์ญ์ ํ ์ ์๋๊ฐ?
git restore ํ์ผ์ด๋ฆ.ํ์ฅ์
git checkout ํ์ผ์ด๋ฆ.ํ์ฅ์
# branch
โ
(ํด๋น ์ ์ฅ์ ๋ด์์) ๋ธ๋์น๋ฅผ ํ์ธํ ์ ์๋๊ฐ?
git branch
โ
๋ธ๋์น๋ฅผ ์์ฑํ ์ ์๋๊ฐ?
git branch ๋ธ๋ฐ์น
โ
์ปค๋ฐ ๋ด์ญ์ ํ์ธํ ์ ์๋๊ฐ?
git log --oneline
โ
๋ธ๋์น ๋ก๊ทธ ๊ทธ๋ํ๋ฅผ ํ์ธํ ์ ์๋๊ฐ?
git log --oneline --branches --graph
โ
๋ธ๋์น๋ฅผ ์ด๋ํ ์ ์๋๊ฐ?
git checkout ํด๋น๋ธ๋ฐ์น
โ
master ๋ธ๋์น์ ๋ธ๋์น๋ฅผ ๋ณํฉํ ์ ์๋๊ฐ?
git merge ๋ณํฉ ๋์ ๋ธ๋ฐ์น
โ
์ถฉ๋์ ํด๊ฒฐํ ์ ์๋๊ฐ?
์ง์ ์ถฉ๋ ํด๊ฒฐ, ํ์ผ ์์ ํ ์ปค๋ฐ
# remote ์ ์ฅ์
โ
๊น๊ณผ ๊นํ๋ธ์ ์ฐจ์ด์ ์ ์๋๊ฐ?
git : ๋ถ์ฐ ๋ฒ์ ๊ด๋ฆฌ ์์คํ
github : git์ ์ง์ํ๋ ํ๋ซํผ
โ
๋ก์ปฌ ์ ์ฅ์์ ์๊ฒฉ ์ ์ฅ์๋ฅผ ์ฐ๊ฒฐํ ์ ์๋๊ฐ?
git remote add origin ์๊ฒฉ์ฃผ์
โ
์๊ฒฉ ์ ์ฅ์์ ์ฐ๊ฒฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋๊ฐ?
git remote -v
โ
๋ก์ปฌ ์ ์ฅ์์์ ์๊ฒฉ ์ ์ฅ์๋ก pushํ ์ ์๋๊ฐ?
git push origin ๋ธ๋ฐ์น
โ
์๊ฒฉ ์ ์ฅ์์์ ๋ก์ปฌ ์ ์ฅ์๋ก pullํ ์ ์๋๊ฐ?
git pull origin master
git pull
โ
๋ก์ปฌ ์ ์ฅ์์์ ๋ง๋ ๋ธ๋์น๋ฅผ ์๊ฒฉ ์ ์ฅ์์ ๋ฐ์ํ ์ ์๋๊ฐ?
โ
์๊ฒฉ ์ ์ฅ์์ ๋ธ๋์น๋ฅผ ๋ก์ปฌ ์ ์ฅ์๋ก ๊ฐ์ ธ์ฌ ์ ์๋๊ฐ?
git pull
git checkout -b ๋ณ๊ฒฝ๋์ ๋ธ๋ฐ์น ์๋ ๋ธ๋ฐ์น
git checkout -t ์๋ ์๊ฒฉ ๋ธ๋ฐ์น
โ
pull๊ณผ fetch์ merge์ ์ฐจ์ด์ ์ ์๋๊ฐ?
pull == fetch + merge
=> git fetch => git checkout FETCH_HEAD => git merge FETCH_HEAD
โ
pull-request๋ฅผ ํ ์ ์๋๊ฐ?
github
โ
์๊ฒฉ ์ ์ฅ์๋ฅผ ๋ณต์ ํด ๋ก์ปฌ ์ ์ฅ์๋ก ๊ฐ์ ธ์ฌ ์ ์๋๊ฐ?
git clone ์ฃผ์
โ
fork์ ๋ํด ์ดํดํ๋๊ฐ?
# 0504 - JPA๋ก ์ธ๋ฑ์ค ์ฌ์ฉ
# JPA๋ก ์ธ๋ฑ์ค ์ฌ์ฉ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐ๊ฑด๋ฌธ ์กฐํ์, ํ ์ด๋ธ ์ ์ฒด๋ฅผ full scan, ๋นํจ์จ์ ์ธ๋ฑ์ค ํ ์ด๋ธ ํ์ฉ(B-Tree ์๋ฃ๊ตฌ์กฐ)
O(n) => O(logn) ์๊ฐ๋ณต์ก๋
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor
@Getter
@ToString
@EqualsAndHashCode(of = "userSeq")
@DynamicUpdate
@Entity
@Table(name = "users",
// ์ธ๋ฑ์ค ์ค์
indexes = {
@Index(name = "users_email_idx", unique = true, columnList = "email"),
@Index(name = "users_nickname_idx", unique = true, columnList = "nickname"),
@Index(name = "users_user_type_idx", columnList = "user_type"),
@Index(name = "user_deleted_active_idx", columnList = "deleted,active")
}
)
public class Users extends BaseEntity {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "user_seq", updatable = false, nullable = false)
private Long userSeq;
...
}
๊ฒฐ๋ก
๋ฐ์ดํฐ ์กฐํ์ ์๋์ ์ํฅ์ ๋ฏธ์น์ง๋ง
์ธ๋ฑ์ค๋ฅผ ๊ณผ๋ํ๊ฒ ์ค์ ์ ์์ฒด๋ง์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ง์ด ์ฐจ์งํ๊ณ , ํ
์ด๋ธ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ธ๋ฑ์ค ์ ๋ ฌ ์์๋ ๋งค๋ฒ ์์ ์ด ๋์ด์ผํ๋ฏ๋ก ๋นํจ์จ์ ๋ณ๋๋ค.
๋ณตํฉ์ธ๋ฑ์ค ์ฌ์ฉ์ ๊ฐฏ์๋ 3~4๊ฐ๊ฐ ์ ๋นํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ๊ณ ๋ฅผ๋์๋ ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ ์์๋๋ก ๊ณ ๋ฅด๋๊ฒ ํจ์จ์ ์ด๋ค.
B-Tree๋ LIKE ๊ฒ์์ผ๋ก ์ค๊ฐ์ผ์น, ํ๋ฐฉ์ผ์น ๊ฒ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋ฐฉํ์(full-text)์ด ์๋๋ผ๋ฉด, ์๋ผ์คํฑ์์น๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ฒ์์ ํจ์จ์ ๋์ด๋๊ฒ ์ข๋ค.
# 0505 - JPA ํน์ type ์ ์
# JPA ํน์ type ์ ์
# Spring Data JPA ๊ธฐ๋ฐ์ด ๋๋ Hibernate์ type์ ์ถ๊ฐํ๊ธฐ ์ํ์ฌ vladmihalcea์ hibernate-types
๋ฅผ ์ถ๊ฐ
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.10.1</version>
</dependency>
# TypeDef ์ถ๊ฐ
- jsonb
package me.oofbird.jpa
import org.hibernate.annotations.TypeDef;
import com.vladmihalcea.hibernate.type.json.JsonBinaryType;
import javax.persistence.*;
@Entity
@Table(name = "TB_TEST")
@TypeDef(
name = "jsonb",
typeClass = JsonBinaryType.class)
public class TestTable {
...
@Type(type = "jsonb")
@Column(name = "JSON_TEXT", columnDefinition = "jsonb")
private JsonPOJOObject jsonText;
...
}
- list-array
@Entity
@Table(name = "TB_TEST")
@TypeDef(
name = "list-array",
typeClass = ListArrayType.class
)
public class TestTable {
...
@Type(type = "list-array")
@Column(name = "LIST-ARRAY", columnDefinition = "int[]")
private List<Integer> listText = new ArrayList<>();
...
}
# 0506 - ํ์ผ์ ๋ฌธ์์ด ์ฐพ๊ธฐ
grep [option] pattern [file]
# ์ต์
- -c : ๋งค์นญ๋ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ์ง ์๊ณ ๋งค์นญ๋ ํ์ ์ด ๋ผ์ธ ์๋ฅผ ์ถ๋ ฅํ๋ค.
- -i : ๋งค์นญ์ ์ฌ์ฉํ๋ ๋ฌธ์์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋๋ค.
- -l : ํจํด์ ๋งค์นญ๋ ๋ผ์ธ์ด ํ๋๋ผ๋ ์๋ ํ์ผ์ ์ด๋ฆ๋ง์ ์ถ๋ ฅํ๋ค.
- -n : ํ์ผ ๋ด์์ ๋งค์นญ๋ ํ ๋ฒํธ๋ฅผ ํจ๊ป ์ถ๋ ฅํ๋ค.
- -s : ์๋ฌ ๋ฉ์์ง ์ธ์๋ ์ถ๋ ฅํ์ง ์๋๋ค.
- -v : ํจํด๊ณผ ๋งค์นญ๋์ง ์๋ ํ๋ง ์ถ๋ ฅํ๋ค.
- -w : <์ >๋ก ๋๋ฌ์ธ์ธ ํจํดํํ์ ํ๋์ ๋จ์ด๋ก ์ทจ๊ธํ์ฌ ๊ฒ์ํ๋ค.
# ์ ๊ทํํ์ ๋ฉํ ๋ฌธ์
- ^ : ํ์ ์์ ์ง์์ ex) ^joon : joon์ผ๋ก ์์ํ๋ ๋ชจ๋ ํ์ ์ถ๋ ฅํจ
- $ : ํ์ ๋ ์ง์์ ex) joon$ : joon์ผ๋ก ๋๋๋ ๋ชจ๋ ํ์ ์ถ๋ ฅํจ.
- . : ํ๋์ ๋ฌธ์์ ๋์
ex) j..n : ์ด 4๊ฐ์ ๋ฌธ์๋ก ์ด๋ฃจ์ด์ง ๋ฌธ์์ด ์ค์ ์ฒ์ ๋ฌธ์๋ j ๋๋ฌธ์๋ n์ผ๋ก ๋๋๋ ๋ฌธ์์ ํ์ ์ถ๋ ฅํจ - * : ๋งค์นญ๋๋ ๋ฌธ์๊ฐ ์๊ฑฐ๋ ํ๋ ์ด์์ ๋ฌธ์์ ๋ํด ๋งค์นญ ex)joo* : joo, joon, jooo, jood, joon0312 ์ ๋ถ ๋งค์นญ
- [] : [ ]์์ ๋ฌธ์ ์ค ์ด๋ค ํ๋๋ผ๋ ๋งค์นญ ex) joo[n,d,o] : joon, jood, jooo ๋งค์นญ
# 0507 - Java11
# Oracle Java Support RoadMap
# 1. ๋๋ค ํ๋ผ๋ฏธํฐ๋ฅผ ์ํ ์ง์ญ๋ณ์ ํํ
java 10๋ฒ์ ์์ ํธ๋ฆฌํ var ๊ตฌ๋ฌธ์ด ์๊ฒจ๋ ์ํฉ
์์, 11๋ฒ์ ์์๋ ๋๋ค ํ๋ผ๋ฏธํฐ์์ var๋ฅผ ์ด์ฉ ํ ์ ์๊ฒ ๋จ
list.stream()
.map((@NotNull var s) -> s.toLowerCase())
.collect(Collectors.toList());
# 2. HTTP Client (Standard)
- Non-Blocking request and response ์ง์ (with CompletableFuture)
- Backpressure ์ง์(java.util.concurrent.Flow ํจํค์ง๋ฅผ ํตํด Rx Flow๋ฅผ ๊ตฌํ์ฒด์ ์ ์ฉ)
- Factory method ํํ๋ก ์ง์
- HTTP/2 ์ง์
- Sptring5์์๋ Rest Client์ RestTemplate ๋์ WebClient๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ๊ตฌํ ๊ฐ๋ฅ.
=> ๊ธฐ์กด ๋ฉํฐ์ฐ๋ ๋ ๋ฐฉ์์ ๋ฒ๋ฆฌ๊ณ Reactor(WebFlux) ์ ํจ๊ป ์คํ๋ง ๊ธฐ๋ฐ ์น์๋น์ค๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ ๊ทธ์ ๋ฐ๋ฅธ ์ฑ๋ฅ๊ณผ ํจ์จ ํฅ์์ ์ด๋ง์ด๋ง ํฉ๋๋ค.
# 3. ๋ชจ๋
- ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ ์ ๊ฒ ์ฌ์ฉ
- ํนํ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์ ์ฉ
- ๋ฐํ์์ด ๋ ์์์ง๊ณ , ๋๊ฐ๋ฒผ์์ ธ์ ๋ ๋น ๋ฅด๊ฒ ์์
- ๊ฐ๋ ฅํ ์บก์ํ๋ฅผ ์ ์ฉ
# 4. ํ๋กํ์ผ๋ง ๋ฐ ์ง๋จ
# Java Flight Recorder
์คํ ์ค์ธ Java ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ง๋จ ๋ฐ ํ๋กํ์ผ๋ง ๋ฐ์ดํฐ ์์ง, Java 11์์๋ ๋๋ค ์คํ ์์ค
# Java Mission Control
- JFR ๋ฐ JMC๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์, GC ์ค๋ฒํค๋, ํซ ๋ฉ์๋ ์ค๋ ๋ ๋ณ๋ชฉ ์ํ ๋ฐ I/O ๋ธ๋กํน๊ณผ ๊ฐ์ ๋ฐํ์ ๋ฌธ์ ๋ฅผ ์ง๋จ
# ํตํฉ ๋ก๊น
# ์ค๋ฒํค๋๊ฐ ๋ฎ์ ํ ํ๋กํ์ผ๋ง
# StackWalker
# 5. ๊ฐ๋น์ง ์์ง
- Java 11์ ๊ธฐ๋ณธ ๊ฐ๋น์ง ์์ง๊ธฐ๋ G1GC(๊ฐ๋น์ง ์ฐ์ ๊ฐ๋น์ง ์์ง๊ธฐ)
- ZGC๋ ์ผ์ ์ค์ง ์๊ฐ์ 10ms ๋ฏธ๋ง์ผ๋ก ์ ์งํ๋ ค๊ณ ํ๋ ๋๊ธฐ ์๊ฐ์ด ์งง์ ๋์ ์์ง๊ธฐ
# ์ก์ค๋ก
์ก์ค๋ก ๊ฐ๋น์ง ์์ง๊ธฐ ํ ๋น๋ง์ ์ฒ๋ฆฌํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ์ง์๋๋ค. ํ์ด ์์ง๋๋ฉด JVM์ด ์ข ๋ฃ
# Docker ์ปจํ ์ด๋์ ํฅ์๋ ๊ธฐ๋ฅ
Java 10๋ถํฐ JVM์ ์ปจํ ์ด๋ ์ ์ด ๊ทธ๋ฃน(cgroup)์ ์ํด ์ค์ ๋ ์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฉ
# 6. ์ฑ๋ฅ ํฅ์
# 0508 - ๋งฅ ํฐ๋ฏธ๋์์ AWS EC2 ํฐ๋ฏธ๋ ์ ์
# ํคํ์ผ ํผ๋ฏธ์ ๋ณ๊ฒฝ
$ chmod 400 ๊ฒฝ๋ก/keyfile.pem
# ํฐ๋ฏธ๋์์ ํคํ์ผ ์ต์ ์ ์ถ๊ฐํ ๋ช ๋ น์ผ๋ก ssh ์ ์
$ ssh -i ๊ฒฝ๋ก/keyfile.pem ec2-user@[์๋ฒ ์์ดํผ ๋๋ ๋๋ฉ์ธ]
# 0509 - jUnit5 ์ฌ์ฉ
# ์์กด์ฑ(gradle)
dependencies {
testCompile('org.junit.jupiter:junit-jupiter:5.7.1')
testCompile('org.assertj:assertj-core:3.19.0')
}
# ์์
class RefereeTest {
private static final List<Integer> ANSWER = Arrays.asList(1, 2, 3);
private Referee referee;
@BeforeEach
void setUp() {
referee = new Referee();
}
@ParameterizedTest
@CsvSource({"1,2,3,0 ๋ณผ 3 ์คํธ๋ผ์ดํฌ", "3,1,2,3 ๋ณผ 0 ์คํธ๋ผ์ดํฌ", "1,3,2,2 ๋ณผ 1 ์คํธ๋ผ์ดํฌ", "7,8,9,์์"})
public void compare(int number1, int number2, int number3, String expected) {
String actual = referee.compare(ANSWER, Arrays.asList(number1, number2, number3));
assertThat(actual).isEqualTo(expected);
}
@Test
void ์คํธ๋ผ์ดํฌ3() {
String result = referee.compare(ANSWER, Arrays.asList(1, 2, 3));
assertThat(result).isEqualTo("0 ๋ณผ 3 ์คํธ๋ผ์ดํฌ");
}
...
}
- @Test : ํ ์คํธ ๋ฉ์๋์์ ๋ช ์
- @ParameterizedTest : ๋งค๊ฐ๋ณ์๊ฐ ์๋ ํ ์คํธ์์ ๋ช ์
- @BeforeEach : ํด๋น ๋ฉ์๋๋ ํ์ฌ ํ ์คํธ ํด๋์ค์ ๊ฐ๊ฐ์ ๋ฉ์๋ ๋ณด๋ค ๋จผ์ ์คํ๋๋ค.
- @CsvSource : ์ฌ๋ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
,
๋ก ๊ฐ์ ๊ตฌ๋ถ delimiter ์์ฑ์ ์ฌ์ฉํด ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅ