0321 - 0328
# 0321 - 0328
# 0321 - ์๋ฐ ํ์ค (JLS, JSR, JEP)
์๋ฐ ์คํ ๊ด๋ จํด์ JSR-123, JLS-123 ์ฒ๋ผ ์คํ์ ํ์ธํ ์ ์๋ค. ์ด๋ฐ ์คํ๋ค์๋ '์๋ฐ ์ปค๋ฎค๋ํฐ ํ๋ก์ธ์ค(JCP, Java Community Process)'๊ฐ ์๋ค.
# ์๋ฐ ๊ฐํ ์ ์ (Java Enhancement Proposal, JEP)
์๋ฐ ์ฝ์ด ๊ธฐ์ ์ ๊ฐํํ๊ธฐ์ํ ์ ์ ๋ฌธ์๋ค. ์ด ์ ์๋ค์ ๋๋ถ๋ถ ์ด์ด์ ์ค๋ช
ํ JSR์ด๋ JLS๊ฐ์ ๋ช
์ธ๋ก ์ ๋ฆฌํ ์ํ๋ ์๋๋ค. OpenJDK/JDK์ ์
๋ฐ์ดํธ์ ํฌํจ๋ ์ ์๋ ์ ์ ๋ชฉ๋ก๋ค์ด๋ค.
์ฑํ๋ JEP๋ ํน์ JDK๋ฆด๋ฆฌ์ฆ์ ํฌํจ๋ ์ ์์ผ๋ฉฐ, ๋ชจ๋ JEP๊ฐ ์น์ธ๋์ด ์
๋ฐ์ดํธ์ ํฌํจ๋๋๊ฑด ์๋๋ค.
JEP์ ์ ์๋๋ ๋ชฉ๋ก๋ค์ด JDK์ ๋ก๋๋งต์ด ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์คํ ๊ฐ๋ฅํ ๊ฒ๊ณผ ์คํ ๋ถ๊ฐ๋ฅํ ๊ฒ๋ค์ ๋๋๊ณ ๋ช ์ธ๊ฐ ์์ฑ๋ ์ ์๋ ์ง์ ๊น์ง ๋ช ํํ๊ฒ ํ๊ธฐ ์ํด ํ๋กํ ํ์ดํ์ด ํ์ํ๋ค.
# ์๋ฐ ์์ฒญ ๋ช ์ธ์(Java Specification Request, JSR)
JCP์ ์ ๋ช
์ธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๊ตฌ์ฑ๋ ํ์๋ค์ ์ํด ๋ง๋ค์ด์ง ๋ฌธ์๋ค. ์ผ๋ฐ์ ์ธ JSR์ ์ฃผ์ ๋ ์ด๋ฏธ ์ฑ์๋ ๊ธฐ์ ๊ณผ ๊ด๋ จ์ด ์๋ค. ๋ค์ ๋งํด์ ๋ถ๋ฅ๋ ์ ์๋ ์ํ์ ์๋ค.
๋ค๋ง ์ด๋ช
์ธ๋ค์ ํญ์ ์๋ฐ์ ๊ด๋ จ๋์ด ์์์๋ ๋๋ก ๋ช
์ธ๋ค์ด Java SE ๋๋ Java EE ๊ธฐ์ ์ ํต์ฌ์ด ๋์ง๋ ์๋๋ค.
# ์๋ฐ ์ธ์ด ๋ช ์ธ์(Java Language Specification, JLS)
์๋ฐ ์ธ์ด ๋ช ์ธ์๋ฅผ ๋ปํ๋ค. JLS๋ ์๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ํ ๋ฌธ๋ฒ๊ณผ ์ ์์ ์ธ/๋น์ ์์ ์ธ ๊ท์น๋ค์ ๋ณด์ฌ์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์์ ์ธ ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ์ํ ํ๋ก๊ทธ๋จ ๋ฐฉ๋ฒ๋ค๋ ๋ณด์ฌ์ค๋ค.
JEP๊ฐ ์ง์์ ์ผ๋ก ๋์ค๊ณ ๊ทธ JEP์ค JSR๋ก ์น๊ฒฉ๋ ๋งํ ๊ฒ์ ์ ๋ณํ ๋ค์ ์น๊ฒฉํ๋ค.
์ด๋ฌํ JSR์ ๊ตฌ์ฒดํ ํด์ ๋ฒ์ ๋ณ๋ก ์ ์ํด๋ ๊ฒ์ด JLS ๋ฌธ์์ด๋ค.
# 0322 - @ElementColleciton, @CollectionTable
# ๊ฐ ํ์ ์ปฌ๋ ์
๋ง ๊ทธ๋๋ก ๊ฐ ํ์ ์ ์ปฌ๋ ์ ์ ๋ด์์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. (@OneToMany ์ฒ๋ผ ์ํฐํฐ๋ฅผ ์ปฌ๋ ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์๋, Integer, String, ์๋ฒ ๋๋ ํ์ ๊ฐ์ ๊ฐ ํ์ ์ ์ปฌ๋ ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.)
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ปฌ๋ ์ ์ ๋ด์ ์ ์๋ ๊ตฌ์กฐ๊ฐ ์๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์๋ ๋ณ๋์ ํ ์ด๋ธ์ ๋ง๋ค์ด์ ์ ์ฅํด์ผ ํ๋๋ฐ, ๊ฐ๋ ์ ์ผ๋ก ๋ณด๋ฉด 1๋ N๊ด๊ณ ์ด๋ค. (๊ฐ ํ์ ์ ์ ์ฅํ๋ ํ ์ด๋ธ์, ๊ฐ ํ์ ์ ์์ ํ ์ํฐํฐ์ ๊ธฐ๋ณธ ํค์, ๋ชจ๋ ๊ฐ ํ์ ํ๋๋ฅผ ๋ฌถ์ด์ PK๋ก ์ฌ์ฉํ๋ฉฐ, ์ํฐํฐ์ ๊ธฐ๋ณธํค๋ฅผ PK๊ฒธ FK๋ก ์ฌ์ฉํ๋ค.)
# @ElementColleciton
๊ฐ ํ์
์ปฌ๋ ์
์ ๋งคํํ ๋ ์ฌ์ฉํ๋ค. @Entity๊ฐ ์๋ Basic Type์ด๋ Embeddable Class๋ก ์ ์๋ ์ปฌ๋ ์
์ ํ
์ด๋ธ๋ก ์์ฑํ๋ฉฐ One-To-Many ๊ด๊ณ๋ฅผ ๋ค๋ฃฌ๋ค.
@ElementColleciton์ @CollectionTable๊ณผ ํจ๊ป ์ฌ์ฉํ๋ค.
@Entity
public class StudyGroup {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// Basic type
@ElementCollection(fetch = FetchType.LAZY)
@Column(name = "TOPIC_NAME")//String์ธ ๊ฒฝ์ฐ์ ํํด์ ์์ธ์ ์ผ๋ก ํ์ฉ, ์ด์ธ ํ์
์ @AttributeOverride๋ฅผ ์ฌ์ฉํด์ ํ
์ด๋ธ ์์ฑ์ ์ฌ์ ์ํ๋ค.
private Set<String> topicTags = new HashSet<String>();
// Embedded type
@ElementCollection
@CollectionTable(name="study_group_member", joinColumns = @JoinColumn(name= "study_group_id", referencedColumnName = "id"))
private List<StudyGroupMember> members = new HashSet<StudyGroupMember>();
}
@Embeddable
public class StudyGroupMember {
private UUID memberId;
private Boolean isOwner;
}
- ๊ฐ ํ์ ์ปฌ๋ ์ ์ ์กฐํ ์ ์ง์ฐ๋ก๋ฉ ์ ๋ต์ ์ฌ์ฉํ๋ค.
- ๊ฐ ํ์ ์ ๊ทธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ถ๋ชจ ์ํฐํฐ์ ์ํด ๊ด๋ฆฌ๋๋ค. ์ฆ ์์์ฑ ์ ์ด(Cascade ALL) + ๊ณ ์ ๊ฐ์ฒด ์ ๊ฑฐ ๊ธฐ๋ฅ์ ํ์๋ก ๊ฐ์ง๋ค.
# @ElementCollection๊ณผ @Entity์ @OneToMany ์ฐจ์ด
@ElementCollection
- ์ฐ๊ด๋ ๋ถ๋ชจ Entity ํ๋์๋ง ์ฐ๊ด๋์ด ๊ด๋ฆฌ๋๋ค.
- ํญ์ ๋ถ๋ชจ์ ํจ๊ป ์ ์ฅ๋๊ณ ์ญ์ ๋๋ฏ๋ก cascade ์ต์ ์ ์ ๊ณตํ์ง ์๋๋ค.
- ๋ถ๋ชจ Entity Id์ ์ถ๊ฐ ์ปฌ๋ผ(basic or embedded ํ์ )์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ณ์ ๊ฐ๋ ์ด ์์ผ๋ฏ๋ก ์ปฌ๋ ์ ๊ฐ ๋ณ๊ฒฝ ์, ์ ์ฒด ์ญ์ ํ ์๋ก ์ถ๊ฐํ๋ค.
@Entity ์ฐ๊ด
- ๋ค๋ฅธ Entity์ ์ํด ๊ด๋ฆฌ๋ ์๋ ์๋ค.
- join table์ด๋ ์ปฌ๋ผ์ ๋ณดํต ID๋ง์ผ๋ก ์ฐ๊ด์ ๋งบ๋๋ค.
# 0323 - docker compose ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
# docker compose๋?
docker compose๋ ์ฌ๋ฌ ๊ฐ์ docker container๋ฅผ ๋ชจ์์ ๊ด๋ฆฌํ๊ธฐ ์ํ ํด์ด๋ค.
์น ์๋น์ค๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ก ํธ์๋ ์๋ฒ, ๋ฒก์๋ ์๋ฒ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๋ก ๊ตฌ์ฑ๋๊ธฐ ๋๋ฌธ์ ๊ฐ ์๋ฒ๋ฅผ Docker container๋ก ์ฐ๊ฒฐํ์ฌ ๋์์ํค๊ณ docker compose๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ปจํ
์ด๋๋ค์ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
# docker-compose.yml
docker- compose.yml์ ์ฅํฉํ ๋์ปค ์คํ ์ต์
์ ๋ฏธ๋ฆฌ ์ ์ด๋ ๋ฌธ์์ด๋ค.
ํ๋ก์ ํธ ๋ฃจํธ์ ํ์ผ์ ๋ง๋ค๊ณ , ์คํ ์ค์ ์ ์ ์ด์ค๋ค. ๊ทธ๋์ผ ํฐ๋ฏธ๋์์ ํ ์ปค ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ
์ด๋๋ฅผ ์คํํ๊ฑฐ๋ ์ฃฝ์ผ ์ ์๋ค.
- ์์คํ ์์์ ๊ฐ๋ํ๋ ์ฌ๋ฌ ์๋ฒ๋ค์ ๊ตฌ์ฑ์ ๋ชจ์์ ์ ์
- version : ๋ฒ์ ์ง์
- services : ์๋น์ค ์ ์
- image : ์ด๋ฏธ์ง ์ง์
- build : Dockerfile ์์น ์ง์
- command : container ์์ ์๋ํ๋ ๋ช
๋ น
- entrypoint : container ์์ ์๋ํ๋ ๋ช
๋ น
- depends_on : ์๋น์ค๊ฐ ์์กด๊ด๊ณ ์ค์
- environment : ์ปจํ
์ด๋ ์ ํ๊ฒฝ๋ณ์ ์ค์
- container_name : ์ปจํ
์ด๋ ์ด๋ฆ ์ค์
- volumes : ์ปจํ
์ด๋์ ๋ณผ๋ฅจ Mount
- volumes_from : ๋ค๋ฅธ ์ปจํ
์ด๋๋ก๋ถํฐ ๋ชจ๋ ๋ณผ๋ฅจ ๋ง์ดํธ
- links : ๋ค๋ฅธ ์ปจํ
์ด๋์ ์ฐ๊ฒฐ
- ports : Host ์ ์ปจํ
์ด๋๊ฐ ๊ณต๊ฐํ๋ ํฌํธ์ง์
- expose : ์ปจํ
์ด๋๋ผ๋ฆฌ ๊ณต๊ฐํ๋ ํฌํธ ์ง์
# docker-compose ๊ธฐ๋ณธ ๋ช ๋ น์ด
- docker-compose up [์ต์ ] [์๋น์ค๋ช ] : ์ปจํ ์ด๋๋ฅผ ์์ฑ ๋ฐ ์คํํ๋ค.
-d : ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
--No-deps : ๋งํฌ ์๋น์ค ์คํํ์ง ์์
--build : ์ด๋ฏธ์ง ๋น๋
-t : ํ์์์์ ์ง์ (๊ธฐ๋ณธ 10์ด)
- docker-compose ps : ํ์ฌ ๋์์ค์ธ ์ปจํ ์ด๋๋ค์ ์ํ๋ฅผ ํ์ธํ ์ ์๋ค.
- docker-compose logs : ์ปจํ ์ด๋๋ค์ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ค.
- docker-compose run [์๋น์ค๋ช ] [๋ช ๋ น] : docker-compose up ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ์์ฑ ๋ฐ ์คํ๋ ์ปจํ ์ด๋์์ ์์์ ๋ช ๋ น์ ์คํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์ปจํ ์ด๋๋ค์ ๋ชจ๋ ์ญ์ ํ ๊ฒฝ์ฐ docker-compose start๊ฐ ์๋, docker-compose up์ผ๋ก ๋ค์ ์ปจํ ์ด๋๋ค์ ์์ฑํด์ฃผ์ด์ผ ํ๋ค.
- docker-compose (start/stop/pause/unpause/restart) : ์ฌ๋ฌ๊ฐ์ ์๋น์ค ๋๋ ํน์ ์๋น์ค๋ฅผ ์์/์ ์ง/์ผ์์ ์ง/์ฌ์์์ ํ ์ ์๋ค. ๊ฐ๊ฐ์ ์ค์ ๋ค์ ์๋น์ค๋ช ์ ๋ถ์ด๋ฉด ํน์ ์๋น์ค๋ง ์ ์ดํ ์ ์๋ค.
- docker-compose rm : docker-compose๋ก ์์ฑํ ์ปจํ ์ด๋๋ค์ ์ผ๊ด ์ญ์ ํ๋ค.(์ญ์ ์ , ๊ด๋ จ ์ปจํ ์ด๋๋ค์ ์ข ๋ฃ ์์ผ๋์ด์ผ ํ๋ค.)
- docker-compose kill : ์คํ์ค์ธ ์ปจํ ์ด๋๋ฅผ ๊ฐ์ ๋ก ์ ์ง์ํจ๋ค. kill ๋ค์๋ ์๋น์ค๋ฅผ ์ง์ ํ์ฌ ํน์ ์๋น์ค๋ง killํ ์ ์๋ค. -s ์ต์ ์ ์ฌ์ฉํ์ฌ ์๊ทธ๋์ ์ง์ ํด์ค ์ ์๋ค.
- docker-compose down : ๋คํธ์ํฌ ์ ๋ณด, ๋ณผ๋ฅจ, ์ปจํ ์ด๋๋ค์ ์ผ๊ด ์ ์ง ๋ฐ ์ญ์ ์ฒ๋ฆฌํ๋ค. (๋ง์ฝ docker-compose down โrmi all ๋ช ๋ น์ ์ฌ์ฉํ๋ค๋ฉด ๋ชจ๋ ์ด๋ฏธ์ง๊น์ง ์ญ์ ํ๋ค.)
- docker-compse port [์๋น์ค๋ช ] [ํ๋ผ์ด๋น ํฌํธ๋ฒํธ] : ์๋น์ค ํ๋ผ์ด๋น ํฌํธ ๋ฒํธ์ ์ค์ ์ ํ์ธํ ์ ์๋ค.
- docker-compose config : ๊ตฌ์ฑ ํ์ผ์ ๋ด์ฉ์ ํ์ธํ ์ ์๋ค. docker-compose.yml์ ๋ด์ฉ์ ์ถ๋ ฅ
# 0327 - ๊ฐ๋ณ์ธ์(varargs)
- ํํ
public void test(string... parameter) {
...
}
# ์ค๋ฒ๋ก๋ฉ
์๋ฐ์์๋ ํ๋ผ๋ฏธํฐ ๊ฐ์๊ฐ ๋ค๋ฅด๋ฉด ๋ค๋ฅธ ๋ฉ์๋๋ก ์ธ์ ํ๋ค.
๋์ผํ ๊ธฐ๋ฅ์ ํ์ง๋ง ํ๋ผ๋ฏธํฐ๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ์ค๋ฒ๋ก๋ฉ์ ์ฌ์ฉํ๋ค.
// ํ๋ผ๋ฏธํฐ๊ฐ ํ ๊ฐ์ธ ๊ฒฝ์ฐ
public void search(String one) {}
// ํ๋ผ๋ฏธํฐ๊ฐ ๋ ๊ฐ์ธ ๊ฒฝ์ฐ
public void search(String one, String two) {}
// ํ๋ผ๋ฏธํฐ๊ฐ ์ธ ๊ฐ์ธ ๊ฒฝ์ฐ
public void search(String one, String two, String three) {}
// Map์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
public void search(Map<String, String> param) {}
// ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
public void search(String[] param) {}
// List๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
public void search(List<String> param) {}
// VO๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
public void search(ParamVO param) {}
# ๊ฐ๋ณ์ธ์
๊ฐ๋ณ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ ์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ์ ์์ผ๋ฉฐ ์๋ฐ 1.5๋ถํฐ ์ง์๋๋ค. ์ฌ์ฉ๋ฒ์ ๋ณ์ ํ์ ๋ค์ ๊ธฐํธ(...)๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋ฉ๋๋ค.
๊ฐ๋ณ์ธ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ ์๋ ๋ฐฉ๋ฒ ๋ชจ๋ ๊ฐ๋ฅํ๋ค
public void callMethod() {
// ํ๋ผ๋ฏธํฐ๊ฐ ์์
test();
// ํ๋ผ๋ฏธํฐ๊ฐ ํ๊ฐ
test("A");
// ํ๋ผ๋ฏธํฐ๊ฐ ๋๊ฐ
test("A", "B");
// ๋ฐฐ์ด๋ก ์ ๋ฌ
test(new String[]{"A", "B", "C"});
}
public void test(String... param) {
System.out.println("param: " + param);
}
๋ค๋ฅธ ํ๋ผ๋ฏธํฐ์ ๊ฐ๋ณ์ธ์๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๊ฐ๋ณ์ธ์๋ฅผ ์ ์ผ ๋ค์ ์์น ์์ผ์ผ ํ๋ค.
public void test2(String name, String... param) {
System.out.println("param: " + param);
}