kok202
@kok202
Students
3,836
Reviews
292
Course Rating
4.9
- (ํ) ์นด์นด์ค ๋ฐฑ์๋ ์์ง๋์ด
- (์์) ๐ ๊ณต๊ฐ SW ๊ฐ๋ฐ์ ๋ํ [2020 ์ผ๋ฐ๋ถ๋ฌธ / ๊ธ์_์ ๋ณดํต์ ์ฐ์ ์งํฅ์์ฅ์]
ํ์ฌ ์นด์นด์ค์์ ์ผํ๊ณ ์๊ณ , ๋ง๋๋ ๊ฒ์ ์ข์ํด์, ํด๊ทผ ํ์๋ ํญ์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฐ๋ฐํ๊ณ ์์ต๋๋ค.
"๊ฑฐ์ธ์ ์ด๊นจ ์์ ์ ๋์์ด"๋ผ๋ ๋ง์ด ์์ต๋๋ค. ์ ์ญ์ ํ๋ฑ ์์ ๋์์ด์ผ ๋ฟ์ด์ง๋ง, ์ฌ๋ผํ ๊ฑฐ์ธ์ ์ฑ์ฅ์ ๋์์ด ๋ ์ ์๋๋ก ์ง์์ ๋๋ฌผ๋ฆผ์ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ๋ค์์ ์ฃผ๋์ด ๊ฐ๋ฐ์๋ถ๋ค์ ๋ฉํ ๋ง ํ ๊ฒฝํ์ด ์์ด์ ์ฌ๋ฌ๋ถ์ ์ฑ์ฅ์ ๋์์ค ์ ์์ ๊ฑฐ์์.
๊นํ๋ธ > https://github.com/kok202
๋ธ๋ก๊ทธ > https://kok202.tistory.com
Courses
Reviews
- A developer's cheat sheet for adding Java/Spring tests
- Java/Spring Junior Developer's Mistake Notes
- Java/Spring Junior Developer's Mistake Notes
- Deep Learning for Developers
- A developer's cheat sheet for adding Java/Spring tests
Posts
Q&A
ํน์ git ํ๋ฌ๊ทธ์ธ ์์๋ ๋ถ
์๋ ํ์ธ์. ์ด๋ค ๊ธฐ๋ฅ์ ๋ฌผ์ด๋ณด์๋์ง ์ ํํ ์ ์ดํด๊ฐ ์ ๋๋๋ฐ์. ํน์ ์๋ ๊ธฐ๋ฅ์ ๋งํ์๋ ๊ฒ ๋ง์ผ์ค๊น์?(์ฌ์ง)์ด๋ IntelliJ ๊ธฐ๋ณธ ๋ด์ฅ ๊ธฐ๋ฅ์ ๋๋ค. ์ปค๋ฐ ์ > Run SpotBugs analysis, ์ปค๋ฐ ์ > Scan with Checkstyle ์ ๋๋ง IntelliJ ์ถ๊ฐ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ ํ๊ธฐ๋๋ ๋ด์ฉ์ด๊ณ ์. (๊ฐ๊ฐ SpotBugs, Checkstyle ํ๋ฌ๊ทธ์ธ์ ๋๋ค.)ํน์ IntelliJ Ultimate ์ ์ฉ ๊ธฐ๋ฅ์ธ๊ฐ ์ถ์ด Community์์๋ ์๋ณด์ด๋๋ ํ์ธํด ๋ดค์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Ultimate, Community ๊ด๊ณ์์ด ์ ๋ณด์ด๋ ๊ฒ๋ ํ์ธํ์ต๋๋ค.IntelliJ์์ Commit ๋ฐฉ์์ ํญ ๋ฒ์ ์ผ๋ก ํ๊ณ ์๋ ๊ฒ์ ์๋๊ฐ์? modal ๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ์ค์ ๋ณ๊ฒฝํด ๋ณด๋ ๊ฒ์ ์ด๋ค์ง์? (์ฌ๊ธฐ: https://engineerinsight.tistory.com/90) ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.๋ฒ์ธ ์ฐธ๊ณ : https://intellij-support.jetbrains.com/hc/en-us/community/posts/360007373539-The-new-Commit-tab
- 0
- 1
- 510
Q&A
ํจํค์ง ์์กด์ฑ์ ํ์ธํด๋ณด๋๋ฒ?
์ฌ์ฉํด ๋ณธ ์ ์ด ์๊ธฐ์ ํด์ ์กด์ฌ๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค์. ์๊ณ ์์๋ค๋ฉด ์ ๋ ๊ฐ์์์ ์๊ฐํ์ ๊ฒ ๊ฐ์ต๋๋ค.๐ญ ์ ๋ ๋งค๋ฒ ์ฐพ์๋ณผ ๋๋ง๋ค ์ํ๋ ์์ค์ผ๋ก ๋์ค๋ ๊ฑธ ๋ชป ๋ด์, ๊ทธ๋ฅ ์ผ์ผ์ด ๋์ผ๋ก ํ์ธํ๊ณ ์์์ต๋๋ค.๊ทธ๋์ ์ง๋ฌธ ์ฃผ์ จ๊ธฐ์ ๋ง์นจ ๊ธฐํ๋ค ์ถ์ด์ ๋ค์ ์ฐพ์๋ดค๋๋ฐ์. ๊ทธ๋๋ง ๊ฐ์ฅ ๊ด์ฐฎ์ ๋ฐฉ๋ฒ์ IntelliJ Ultimate ๋ฒ์ ์ ๋ถ์ ๊ธฐ๋ฅ์ด ์๋๊ฐ ์ถ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ถ์ ๊ธฐ๋ฅ์ ์ ๊ณตํด ์ฃผ๋ค์.(์ฌ์ง)๊ฐ ๊ธฐ๋ฅ ๋ชจ๋ ํจํค์ง, ํด๋์ค ์์ค๊น์ง ์์กด์ฑ์ ํ์ธํ ์ ์์ต๋๋ค.์ฐธ๊ณ .1 https://jaehoney.tistory.com/311์ฐธ๊ณ .2 https://v0o0v.tistory.com/4๊ทธ๋ฐ๋ฐ ์ ์ ๋์ฆ๋ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๋ณด๊ณ ์ถ์ ๊ฒ์ด๋ผ, ์์งํ ์ ๊ธฐ๋ฅ์ด ์ผ๋ง๋ ์ธ๋ชจ ์๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
- 0
- 2
- 1.6K
Q&A
๋๋ฉ์ธ ๊ฐ์ฒด์ ์์์ฑ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ๊ฒ ๋๋ฉด
์๋ ํ์ธ์. ๊ทผ๋์ ์ฑ ์ ์งํํ ๊ธฐํ๊ฐ ์๊ฒจ ๊ทธ์ชฝ์ ํ์ ์ค์ด์ฃผ๋ค ๋ณด๋ ๋ค๋ฅธ ์ผ์ ์ ๊ฒฝ ์ฐ์ง ๋ชปํ์ต๋๋ค. ๋ต๋ณ์ด ๋ฆ์ด ์ฃ์กํฉ๋๋ค. ๋ค๋ง ํด๋น ๊ฐ์๋ ๊ณต์์ ์ผ๋ก ์ง์์๋ต์ ์ ๊ณตํ์ง ์๋ ๊ฐ์์๋ค๋ ์ ์ ์ด์ ๋ก ๋ฆ์ด์ง ๋ถ๋ถ์ ๋ํด ์ํด ๋ถํ๋๋ฆฝ๋๋ค.๊น๋จํธ ๋์ด ์ข์ ๋ต๋ณํด ์ฃผ์ ๊ฒ ๊ฐ๋ค์. ๊ฐ์ฌํฉ๋๋ค.์ด์ผ๊ธฐํ์ ๋๋ก ๋๋ฉ์ธ ๊ฐ์ฒด์ ์์์ฑ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ๋ฉด JPA์์ ์ ๊ณตํด ์ฃผ๋ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๊ฒ์ด ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ์ ์์กด์ฑ ์ญ์ ์์น์ด ์ถ๊ตฌํ๋ ๋ฐฉํฅ์ ๋๋ค. ๋ ์ด๋ก ๋ชจ๋ ์์คํ ์ด ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ข ์๋์ง ์์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์ง๋ฅผ ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.์ด์ ๊ด๋ จํด์๋ ์ด์ ์ ๋น์ทํ ๋ต๋ณ์ ํ ์ ์ด ์๊ธฐ์ ๋งํฌ๋ก ๋์ฒดํ๊ฒ ์ต๋๋ค.https://www.inflearn.com/questions/947209/jpa์-๋ํฐ์ฒดํน-์ฌ์ฉ์-๋ํด์https://www.inflearn.com/questions/945855/comment/280701https://www.inflearn.com/questions/978220๋๋ถ์ด ์๋ฐฉํฅ ๋งคํ์ ์ฌ์ค์ ์ํ ํจํด์ผ๋ก ์ํฐ ํจํด์ ๋๋ค. ๊ทผ๋ณธ์ ์ผ๋ก ์๋ฐฉํฅ ๋งคํ์ ์ ๋ง๋๋ ๊ฒ์ด ์ ์ผ ์ข์ต๋๋ค. ๋จ๋ฐฉํฅ ๋งคํ์ผ๋ก๋ง ๊ฐ์ฒด ๊ด๊ณ๋ฅผ ์ ์ํ๋ฉด ์๊ฐ๋ณด๋ค ์์ฑ ์์ ์ด ์ฝ์ต๋๋ค.
- 0
- 3
- 1.8K
Q&A
UUID, Random ๋ฑ ์์ฃผ ์ฌ์ฉํ๋ ์์กด์ฑ์ ๊ฒฝ์ฐ
์๋ ํ์ธ์. ๊ทผ๋์ ์ฑ ์ ์งํํ ๊ธฐํ๊ฐ ์๊ฒจ ๊ทธ์ชฝ์ ํ์ ์ค์ด์ฃผ๋ค ๋ณด๋ ๋ค๋ฅธ ์ผ์ ์ ๊ฒฝ ์ฐ์ง ๋ชปํ์ต๋๋ค. ๋ต๋ณ์ด ๋ฆ์ด ์ฃ์กํฉ๋๋ค. ๋ค๋ง ํด๋น ๊ฐ์๋ ๊ณต์์ ์ผ๋ก ์ง์์๋ต์ ์ ๊ณตํ์ง ์๋ ๊ฐ์์๋ค๋ ์ ์ ์ด์ ๋ก ๋ฆ์ด์ง ๋ถ๋ถ์ ๋ํด ์ํด ๋ถํ๋๋ฆฝ๋๋ค.๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ์ ํธ ํด๋์ค๋ค์ ํ๋์ ํจํค์ง์ ๋ชจ์ ๊ด๋ฆฌํ๋์ง๊ฐ ๊ถ๊ธํ ๊ฒ์ผ๋ก ๋ณด์ด๋๋ฐ ๋ง์ผ์ค์ง์? ๋ค, ๊ทธ๋ ๊ฒ ์ฌ์ฉํฉ๋๋ค. util ํจํค์ง๊ฐ ์๊ธฐ๋ ๊ฒ ์์ฒด๋ ์ ํ ์ด์ํ ๊ฒ ์๋๋๋ค. ์คํ๋ง ํ๋ ์์ํฌ์์๋ util ํจํค์ง ์ฌ์ฉํฉ๋๋ค. (์ฐธ์กฐ: https://github.com/spring-projects/spring-framework/tree/main/spring-core/src/main/java/org/springframework/util) ๊ทธ๋ฆฌ๊ณ ClockHolder, UuidHolder๋ ์ถฉ๋ถํ util ํจํค์ง์์ ๊ด๋ฆฌํ ๋งํ ์ธํฐํ์ด์ค๋ผ ์๊ฐํฉ๋๋ค.๋ค๋ง ๊ทธ๋ ๋ค๊ณ ๋ชจ๋ ํ๋ก์ ํธ์์ ํญ์ util ํจํค์ง๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒ์ ์๋๋๋ค. ์ด๋ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. util ํจํค์ง๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ, ๋๋ฉ์ธ์ผ๋ก ์ฎ์ฌ์ผ ํ ๋น์ฆ๋์ค ๋ก์ง๋ค์ด ์ข ์ข ํด๋์ค ์ด๋ฆ์ util์ด๋ผ๋ ์ด๋ฆ์ ๋ฌ๊ณ util ํจํค์ง๋ก ๋ชจ์ด๋ ๊ฒฝ์ฐ๊ฐ ์๊น๋๋ค. ๊ทธ๋์ ํ๋ก์ ํธ ๋ณ๋ก util ํจํค์ง ์์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ ์ ํธํ์ง ์๊ธฐ๋ ํฉ๋๋ค.๊ทธ๋ฌ๋ ClockHolder, UuidHolder์ ์์น๋ common.domain์ ๋ค์ด๊ฐ๋ ๋๊ณ util์ ๋ค์ด๊ฐ๋ ๋๋ค ์๊ฐํฉ๋๋ค. ์ฌ์ค ํด๋์ค์ ํจํค์ง ์์น๋ ์ด๋ฆ ์์ฒด๋ ๊ทธ๋ ๊ฒ ์ค์ํ ๋ฌธ์ ๊ฐ ์๋๋๋ค.์ํ์๋ ๋ต๋ณ์ด ๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ต๋ณ์ด ๋์ ๋๊ธธ ๋ฐ๋๋๋ค. ๊ฐ์ฌํฉ๋๋ค.+) ์โฆ ๊ทธ๋ฐ๋ฐ ์ ์๊ฐ์ ๋ณธ์ง์ ์ผ๋ก ์ด ์ง๋ฌธ์ ์ค์ ๋ก โ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง๊ฐ ๊ถ๊ธํ๋คโ๊ธฐ๋ณด๋ค, ๊ฐ๋ฐ์ ๋ํ ํ์ ์ด ์์ด์ ๊ธด๊ฐ๋ฏผ๊ฐํ๊ณ ์๋ ๊ฒ์ ๊ธฐ์ธํ ๊ฒ ์๋๊น ์ถ์ต๋๋ค. ๊ทธ๋์ ๋ต์ ์ํ๋ ๊ฒ ๊ฐ๊ธฐ๋ ํ๊ณ ์โฆ? (์ด์ฐจํผ ๊ฐ๋ฐ์ ์ ๋ต์ ์ ํด์ ธ ์์ง ์์ต๋๋ค. ํ์ ๊ณผ ๊ทผ๊ฑฐ๋ง ์์ผ๋ฉด ๋ฉ๋๋ค. ๋ง๋ค์ด ๋ณด๊ณ , ๋ง์ ๋ง๋ค์ด ๋ดค๋๋ ๋ณ๋ก๋ค ์ถ์ผ๋ฉด ์์ ํ๋ฉด ๋์ฃ .) ๊ทธ๋ฌ๋ ๊ทธ๋ฅ ๋ง์๋ดํค๋ ๋๋ก ๊ฐ๋ฐํด ๋ณด๋ ๊ฒ ์ข์ง ์์๊น ์ถ๋ค์!
- 0
- 2
- 819
Q&A
n+1์ง๋ฌธ์ ๋๋ค!
์๋ ํ์ธ์. ๊ทผ๋์ ์ฑ ์ ์งํํ ๊ธฐํ๊ฐ ์๊ฒจ ๊ทธ์ชฝ์ ํ์ ์ค์ด์ฃผ๋ค ๋ณด๋ ๋ค๋ฅธ ์ผ์ ์ ๊ฒฝ ์ฐ์ง ๋ชปํ์ต๋๋ค. ๋ต๋ณ์ด ๋ฆ์ด ์ฃ์กํฉ๋๋ค. ๋ค๋ง ํด๋น ๊ฐ์๋ ๊ณต์์ ์ผ๋ก ์ง์์๋ต์ ์ ๊ณตํ์ง ์๋ ๊ฐ์์๋ค๋ ์ ์ ์ด์ ๋ก ๋ฆ์ด์ง ๋ถ๋ถ์ ๋ํด ์ํด ๋ถํ๋๋ฆฝ๋๋ค.Member โ Team ๊ด๊ณ์์ ํ๊ณผ ํ์์ ๋ํ๋ด๋ ์ ๋ณด๊ฐ ์๋์ ๊ฐ๋ค๊ณ ๊ฐ์ ํฉ์๋ค.@Getter @Builder class Team { private long id; private String name; } @Getter @Builder class Member { private long id; private String name; private Team myTeam; } @Data @NoArgsConstructor @Entity(name = "team") class TeamJpaEntity { @Id private String id; @Column private String name; public Team toModel() { ... } } @Data @NoArgsConstructor @Entity(name = "member") class MemberJpaEntity { @Id private String id; @Column private String name; @ManyToOne @JoinColumn(name = "my_team_id") private TeamJpaEntity myTeam; public Member toModel() { ... } } ์ด๋ ํ ์ ๋ณด์ ํ์ ์ ๋ณด๋ฅผ ๊ฐ์ด ์๋ ๋๋ฉ์ธ ๊ฐ์ฒด์ธ TeamWithMembers ๋ผ๋ ๋๋ฉ์ธ์ด ์๋ค ๊ฐ์ ํฉ์๋ค. TeamWithMembers์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.class TeamWithMembers { private long id; private String name; private List members; } ๊ทธ๋ฆฌ๊ณ TeamWtihMembers์ JpaEntity๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ TeamWithMember๋ฅผ ์ด๋ป๊ฒ ๋ง๋ค ์ ์์์ง ๊ณ ๋ฏผํด ๋ด ์๋ค.๋ฐฉ๋ฒ.1 ์๋น์ค์์ Team ์ ๋ณด, Member ์ ๋ณด๋ฅผ Repository๋ก๋ถํฐ ๋ชจ๋ ๋ถ๋ฌ์ TeamWithMembers ๋๋ฉ์ธ์ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.์ด๋ ์ฆ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ง๋ค๊ฒ ๋ค๋ ์๋ฏธ์ ๋๋ค.class MyService { // ์์กด์ฑ ์ฃผ์ ๋๋ ์ฝ๋ ์๋ต public void doSomething() { Team team = teamRepository.getById(teamId); List members = memberRepository.findByTeamId(teamId); TeamWithMember teamWithMember = TeamWithMember.builder() .id(team.getId()) .name(team.getName()) .members(members) .build(); // ... } } ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ํธ๋์ญ์ ์คํฌ๋ฆฝํธ ๊ฐ์ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง ์ ์์ต๋๋ค. ๊ทธ๊ฒ ์ธ์๋ ํน๋ณํ ๋ฌธ์ ๊ฐ ๋ ๋งํ ์ ์ ๋ณด์ด์ง ์์ต๋๋ค. ์ด๋ฌํ ์ญํ ์ ์ํํ๋ ๊ฒ์ด ์๋น์ค์ ์ญํ ์ธ ๊ฒ์ธ์ง๋ ์ฝ๊ฐ ์๋ฌธ์ด ๋ค๊ธด ํ๋ ๊ทธ๋ ๋ค๊ณ ๋ ์์ ํ ํ๋ฆฐ ์ญํ ์ ์๋๋๋ค. ์ถ๊ฐ๋ก ์ผ๋ ค๋๋ ์ ์ด๋ผ๋ฉด ์ฝ๋๋ฅผ ์ด๋ ๊ฒ ์์ฑํ๋ค ๋ณด๋ฉด ๊ฒฐ๊ตญ TeamWithMembers๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์ญํ ์ ์ ๋ฌธ์ ์ผ๋ก ํ๋ ์๋น์ค๊ฐ ๋ง๋ค์ด ์ง ์ ์๋ค๋ ๊ฒ์ ๋๋ค.๋ฐฉ๋ฒ.2 ๋ฆฌํฌ์งํ ๋ฆฌ์์ Team ์ ๋ณด, Member ์ ๋ณด๋ฅผ Repository๋ก๋ถํฐ ๋ชจ๋ ๋ถ๋ฌ์ TeamWithMembers ๋๋ฉ์ธ์ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.์ด๋ ์ฆ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ง๋ค๊ฒ ๋ค๋ ์๋ฏธ์ ๋๋ค.class TeamWithMembersRepositoryImpl implements TeamWithMembersRepository { // ์์กด์ฑ ์ฃผ์ ๋๋ ์ฝ๋ ์๋ต public TeamWithMembers getById(long teamId) { Team team = teamJpaRepository.getById(teamId); List members = memberJpaRepository.findByTeamId(teamId); return TeamWithMember.builder() .id(team.getId()) .name(team.getName()) .members(members) .build(); } } ํฌ๊ฒ ๋ฌธ์ ์์ด ๋ณด์ ๋๋ค.์ข ํฉํ๋ฉด ์ด์ผ๊ธฐํด ์ฃผ์ ์ํฉ์ Repository์ ์ญํ ๋ก ๋ณด์ ๋๋ค. ์๋ํ๋ฉด Repository์ ์ญํ ์ ๋๋ฉ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ค๋ ๊ฒ์ธ๋ฐ, TeamWithMembersRepositoryImpl์ ๊ทธ ์ญํ ์ ์ ํํ ๋ถํฉํ ์ผ์ ์ํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.์ฌ์ค ์ด ๋ฌธ์ ๋ ์์กด์ฑ ์ญ์ ๋ง ์ ๋๋ก ๋ผ์๋ค๋ฉด ๋ฐฉ๋ฒ.1๋ก ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ.2๋ก ๊ฐ๋ฐํ๋ ํฌ๊ฒ ์๊ด์ด ์๋ ๋ฌธ์ ์ ๋๋ค. ๊ทธ๋์ ๊ฐ๋ฐ์๋ง๋ค ํด์์ด ๋ค๋ฅผ ์ ์๊ณ ์ ๋ ๋ฐฉ๋ฒ.2๊ฐ ๋ง๋ค ์๊ฐํ์ง๋ง, ๋๊ตฐ๊ฐ๋ ๋ฐฉ๋ฒ.1์ด ๋ง๋ค ์๊ฐํ ์๋ ์์ต๋๋ค.ํท๊ฐ๋ฆฐ๋ค๋ฉด ์ด๋๋ ๊ฐ์๊ธฐ Jpa๊ฐ ๊ฐ์๊ธฐ ์ฌ๋ผ์ง๋ค๊ณ ์๊ฐํด ๋ณด๊ธธ ๋ฐ๋๋๋ค. ๊ทธ๋ฆฌ๊ณ โJpa๊ฐ ์๋ JdbcTemplate์ผ๋ก ๋์ฒดํด์ผ ํ ๋ Domain, Service ์ฝ๋๋ฅผ ์ ๊ฑด๋๋ ค๋ ๋๋๊ฐ?โ๋ฅผ ๊ณ ๋ฏผํด ๋ณด์๊ธธ ๋ฐ๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ํฉ์์ ๋ฐฉ๋ฒ.1์ด๋ ๋ฐฉ๋ฒ.2๋ ๋ชจ๋ ์์ ํฉ๋๋ค.๋ต๋ณ์ ๋์์ด ๋๊ธธ ๋ฐ๋๋๋ค.
- 0
- 2
- 896
Q&A
๋ณต์ฌ ๋จ์ถํค
์๋ ํ์ธ์. ๋๋ฌด ๊ฐ๋จํ ์ง๋ฌธ์ธ๋ฐ๋ ๋ต๋ณ์ด ์ด๋ฆฌ ๋ฆ์ด ์ ๋ง ์ฃ์กํฉ๋๋ค.multi cursor๋ผ๋ ๊ธฐ๋ฅ์ ๋๋ค! mac์์ option + shift + click์ด๊ณ window์์ alt + shift + click์ด๋ผ๊ณ ํ๋ค์. ๋ค์ ๋งํฌ ์ฐธ๊ณ ํ์๋ฉด ๋์ ๋ ๊ฒ๋๋ค! (์ฐธ์กฐ: https://www.jetbrains.com/help/idea/multicursor.html?keymap=windows)
- 0
- 2
- 581
Q&A
List<Domain> -> List<Response> ๋ณํ์ Controller์์ ํ๋ ๊ฒ ๋ง๋์?
์๋ ํ์ธ์. ๊ทผ๋์ ์ฑ ์ ์งํํ ๊ธฐํ๊ฐ ์๊ฒจ ๊ทธ์ชฝ์ ํ์ ์ค์ด์ฃผ๋ค ๋ณด๋ ๋ค๋ฅธ ์ผ์ ์ ๊ฒฝ ์ฐ์ง ๋ชปํ์ต๋๋ค. ๋ต๋ณ์ด ๋ฆ์ด ์ฃ์กํฉ๋๋ค. ๋ค๋ง ํด๋น ๊ฐ์๋ ๊ณต์์ ์ผ๋ก ์ง์์๋ต์ ์ ๊ณตํ์ง ์๋ ๊ฐ์์๋ค๋ ์ ์ ์ด์ ๋ก ๋ฆ์ด์ง ๋ถ๋ถ์ ๋ํด ์ํด ๋ถํ๋๋ฆฝ๋๋ค.์ง๋ฌธ์ ์ ๊ฐ ์ ํํ๋ ์ดํดํ์ง ๋ชปํด์ ์ผ๋จ ๊ต์ ํด์ผ ํ ๋ถ๋ถ๊ณผ ๊ถ๊ธํดํ์๋ ๊ฒ ๊ฐ์ ๋ด์ฉ์ ์๋์ ๊ฐ์ด ๋๋ ๋ต๋ณ๋๋ฆฝ๋๋ค.๊ต์ .1 ์ฐ์ Domain โ Response ๋ก์ง์ Reponse๊ฐ ๋ค๊ณ ์์ต๋๋ค. (์ฐธ์กฐ: https://github.com/kok202/test-code-with-architecture/blob/v2.0/src/main/java/com/example/demo/post/controller/response/PostResponse.java) ํ์ธํด ์ฃผ์๋ฉด ์ข์ ๊ฒ ๊ฐ๊ณ ์.๊ต์ .2 Controller๋ Domain ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ต๋๋ค. ์๋น์ค๋ฅผ ํธ์ถํ๊ณ ๋๋ฉ์ธ์ ๊ฐ์ ธ์ Response์ โ๋๋ฉ์ธ โ Reponseโ ๋ณํ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. (์ฐธ์กฐ: https://github.com/kok202/test-code-with-architecture/blob/73453defa54cd3d7d2288814ca1695a0cd3c0a8d/src/main/java/com/example/demo/post/controller/PostController.java#L30)๋ค์์ผ๋ก List์ List๋ก ๋ณํํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ด๋ฐ ๊ฒฝ์ฐ ๋ง์ํ์ ๊ฒ์ฒ๋ผ ๋ณํ ๋ก์ง์ด Controller์ ์์ผ๋ฉด Controller ์ฝ๋๋ ์ง์ ๋ถํด์ง๊ณ Controller๊ฐ ํ๋ ์ญํ ์ ๋ถํฉํ์ง ์๋ ์ผ์ ํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.์ผ๊ธ ์ปฌ๋ ์ ์ ๋ง๋ญ๋๋ค.์ด๋ List๋ณด๋ค Domains๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๊ณ List๋ณด๋ค Responses๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณต์ ๊ฐ์ ๋๋ฉ์ธ์ ๋ณต์ ๊ฐ์ Response๋ก ๋ณํํ๊ณ ์ถ์ ๋ Responses.from(domains)๋ฅผ ํธ์ถํด ๋ณํํ๋๋ก ํฉ๋๋ค.์ผ๊ธ ์ปฌ๋ ์ ๊ณผ ๊ด๋ จ๋ ์์ธํ ๋ด์ฉ์ ๋ค์ ๋งํฌ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ ์ข์ ๋ณด์ ๋๋ค. (์ฐธ์กฐ: https://jojoldu.tistory.com/412, ์ง๋ฌธ๊ณผ ์ ์ฌํ ์ฌ๋ก๋ PayGroups ์ฌ๋ก๋ฅผ ์ฐธ๊ณ ํด ํด๊ฒฐํ๋ฉด ์ข๊ฒ ๋ค์.)View / Render๋ก ๋๋๋๋ค. ์ด๊ฑด ๊ฐ์ธ์ ์ผ๋ก ๋ ๊ฑฐ์ ํ๋ก์ ํธ์ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. Response๋ฅผ View๋ผ ๋ถ๋ฅด๊ณ ๋๋ฉ์ธ์ ์ด์ฉํด View๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํด๋์ค๋ฅผ Render๋ผ ๋ถ๋ฆ ๋๋ค. (๋ช ์นญ์ ์ฌ๋๋ง๋ค ๋ค๋ฅผ ์ ์์ต๋๋ค. ๋ค๋ง ๊ฐ์ธ์ ์ผ๋ก ์ด๋ ๊ฒ ๋ถ๋ฅด๋ ๊ฒ ์ ์ผ ๋์์ต๋๋ค. ์ด๋ ๊ฒ ๋ช ๋ช ํ ์ด์ ๋ ์ฐ๋ฆฌ๊ฐ RestAPI ์๋ฒ๋ฅผ ๋ง๋ค๋๋ผ๋ API ์๋ต์ ๋ด๋ ค์ฃผ๋ ๊ฒ์ด ๊ฒฐ๊ตญ ์๋ ์ MVC ํจํด์ผ๋ก JSP view๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๊ฒ๊ณผ ํฌ๊ฒ ๋ค๋ฅผ ๊ฒ ์๋ค ๋ณด๊ธฐ ๋๋ฌธ์ ๋๋ค.)๊ทธ๋์ ์ด ๊ฒฝ์ฐ๋ ๋ฌธ์ ํด๊ฒฐ์ด ๋ ๊ฐ๋จํฉ๋๋ค. Domain โ View ๋ณํ ๋ก์ง์ ๋ชจ๋ Render๊ฐ ๋ค๊ณ ์๊ฒ ํ๋ ๊ฒ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ฐ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๊ฒ ๋ค์. PostRender.render(posts) ๊ฐ์ธ์ ์ผ๋ก 1๋ฒ ๋ฐฉ๋ฒ์ด ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ข ๋ ๋ง๋ ๋ฐฉํฅ์ด๋ผ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ ์ ํธํฉ๋๋ค.๋ต๋ณ์ ๋์ ๋๊ธธ ๋ฐ๋ผ๋ฉฐ, ๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 866
Q&A
SystemUuidHolder๋ฅผ ํ ์คํธํ๋ ๊ฒฝ์ฐ
์๋ ํ์ธ์. ๊ทผ๋์ ์ฑ ์ ์งํํ ๊ธฐํ๊ฐ ์๊ฒจ ๊ทธ์ชฝ์ ํ์ ์ค์ด์ฃผ๋ค ๋ณด๋ ๋ค๋ฅธ ์ผ์ ์ ๊ฒฝ ์ฐ์ง ๋ชปํ์ต๋๋ค. ๋ต๋ณ์ด ๋ฆ์ด ์ฃ์กํฉ๋๋ค. ๋ค๋ง ํด๋น ๊ฐ์๋ ๊ณต์์ ์ผ๋ก ์ง์์๋ต์ ์ ๊ณตํ์ง ์๋ ๊ฐ์์๋ค๋ ์ ์ ์ด์ ๋ก ๋ฆ์ด์ง ๋ถ๋ถ์ ๋ํด ์ํด ๋ถํ๋๋ฆฝ๋๋ค.์ง๋ฌธ์ด 2๊ฐ์ธ ๊ฒ์ผ๋ก ์ดํดํ์ต๋๋ค.ํ๋๋ SystemUuidHolder๋ ํ ์คํธํด์ผ ํ๋ ๊ฒ ์๋๊ฐ?๋ ๋ค๋ฅธ ํ๋๋ ํ ์คํธ๋ FakeUuidHolder๋ก ํ๋๋ผ๋ ๊ฒฐ๊ตญ ์์คํ ์ด ์คํ๊ฒฝ(Production)์ ๋๊ฐ๋ฉด SystemUuidHolder๊ฐ ์ฌ์ฉ๋ ํ ๋ ์ด์ ๋ํ ํ ์คํธ๋ ๋ค์ ํด์ผ ํ๋ ๊ฒ ์๋๊ฐ?๊ทธ๋์ ์ด๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ๊ฐ์ ๋ํด ๋ต๋ณ๋๋ฆฝ๋๋ค. SystemUuidHolder๋ ํ ์คํธํด์ผ ํ๋ ๊ฒ ์๋๊ฐ?์ ์ด๋ SystemUuidHolder์ ๋์ ์์ฒด๋ ๊ตณ์ด ํ ์คํธํ์ง ์์๋ ๋ฉ๋๋ค. ์๋ํ๋ฉด UUID ํด๋์ค์ ๋์์ ๋๋ฌด๋ ์ ๋ขฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก Clock ํด๋์ค์ ๋์๋ ๋๋ฌด๋ ์ ๋ขฐํ ์ ์๊ธฐ ๋๋ฌธ์ SystemUuidHolder๋ SystemClockHolder์ ๋์์ด ๋ถ์์ ํ ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ 0์ ๊ฐ๊น์ต๋๋ค.๋๋ถ์ด UUID๋ Clock์ ํ ์คํธ๋ UUID ํด๋์ค์ Clock ํด๋์ค๋ฅผ ๋ง๋ JDK ๊ฐ๋ฐํ์ ์ญํ ์ ๋๋ค. ๊ทธ๋ฌ๋ UUID, Clock ๋ฉ์๋๋ฅผ ์ค๊ฐํด ์ค ๋ฟ์ธ SystemUuidHolder, SystemClockHolder์ ๊ตณ์ด ํ ์คํธํ ํ์๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ค์ ๊ตฌํ์ฒด๋ฅผ ํ ์คํธํ ์ง ๋ง์ง ์ฌ๋ถ๋ ๊ฒฐ๊ตญ โ์ค์ ๊ตฌํ์ฒด์ ๋์์ด ์ผ๋ง๋ ์ ๋ขฐํ ์ ์๋๊ฐ?โ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋จํด์ฃผ๋ฉด ๋ฉ๋๋ค. ํ ์คํธ๋ FakeUuidHolder๋ก ํ๋๋ผ๋ ๊ฒฐ๊ตญ ์์คํ ์ด ์คํ๊ฒฝ(Production)์ ๋๊ฐ๋ฉด SystemUuidHolder๊ฐ ์ฌ์ฉ๋ ํ ๋ ์ด์ ๋ํ ํ ์คํธ๋ ๋ค์ ํด์ผ ํ๋ ๊ฒ ์๋๊ฐ?์ด ๋ด์ฉ์ ๊ฐ์ ๋ด์๋ ์ผ๋ถ ํฌํจ๋ ๊ฒ์ผ๋ก ์๋๋ฐ์. 1๋ฒ ๋ต๋ณ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก SystemUuidHolder, SystemClockHolder์ ๋์์ ํ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๋ ๊ฐ๋ test double์ด ์ฌ์ฉ๋ ํ ์คํธ๋ก๋ ์ถฉ๋ถํ๋ค ๋ด ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ธ๋ถ ์์คํ ์ ์ค ํ๊ฒฝ(Production)์ด๋ ์ค ์ค ํ๊ฒฝ(CBT)์์ ๋ค๋ฅธ ๋์์ ๋ณด์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋์ผ๋ก ๋ณด๊ณ ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ๋ง์ต๋๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ ์ด์ฉ ์ ์์ต๋๋ค. ์๋ ํ ์คํธ๋ ๋ํ ํ ์คํธ๋ฅผ ๋ง๋ค์ด ํ ์คํธํด์ผ ํฉ๋๋ค. (๊ทธ๋ฐ๋ฐ ๊ฒฐ๊ตญ ์ด ์ฃผ์ ๋ mockist vs classicist์ ๋๋ค.) ๋ต๋ณ์ด ๋์ ๋๊ธธ ๋ฐ๋๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 566
Q&A
FakeRepository ๋ง๋ค ๋ Join ํ ์ด๋ธํ๋ ๊ฒฝ์ฐ ์ง๋ฌธ๋๋ฆฝ๋๋ค.
์๋ ํ์ธ์. ๊ทผ๋์ ์ฑ ์ ์งํํ ๊ธฐํ๊ฐ ์๊ฒจ ๊ทธ์ชฝ์ ํ์ ์ค์ด์ฃผ๋ค ๋ณด๋ ๋ค๋ฅธ ์ผ์ ์ ๊ฒฝ ์ฐ์ง ๋ชปํ์ต๋๋ค. ๋ต๋ณ์ด ๋ฆ์ด ์ฃ์กํฉ๋๋ค. ๋ค๋ง ํด๋น ๊ฐ์๋ ๊ณต์์ ์ผ๋ก ์ง์์๋ต์ ์ ๊ณตํ์ง ์๋ ๊ฐ์์๋ค๋ ์ ์ ์ด์ ๋ก ๋ฆ์ด์ง ๋ถ๋ถ์ ๋ํด ์ํด ๋ถํ๋๋ฆฝ๋๋ค.์ฐ์ Join์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์์๋ถํฐ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. โ๊ฒ์๋ฌผ โ ๋๊ธโ์ด๋ผ๋ ๊ด๊ณ๊ฐ ์์ ๋ ๋๊ธ์๋ postId๊ฐ ์ ํ์๊ณ , ๊ฒ์๋ฌผ์ ๋ถ๋ฌ์ฌ ๋ ๋๊ธ๋ ๊ฐ์ด ๋ถ๋ฌ์ค๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํฉ์๋ค. ์ด๋ Fake๋ ์๋์ ๊ฐ์ด ๋ง๋ค ์ ์์ต๋๋ค.public class FakePostWithCommentRepository implements PostWithCommentRepository { private final FakePostRepository fakePostRepository; private final FakeCommentRepository fakeCommentRepository; public FakePostWithCommentRepository( FakePostRepository fakePostRepository, FakeCommentRepository fakeCommentRepository) { this.fakePostRepository = fakePostRepository; this.fakeCommentRepository = fakeCommentRepository; } @Override public Optional findById(long id) { return fakePostRepository.findById() .map(post -> PostWithComment.builder() .post(post) .comments(fakeCommentRepository.findByPostId()) .build()); } } ์ฝ๋ aJoin์ด ์ฌ์ฉ๋๋ Fake๋ฅผ ๋ง๋ค ๋ Join์ ํ์ํ ๋ฐ์ดํฐ ์์ค๋ฅผ ๊ฐ๊ณ ์๋ Repository๋ฅผ ์์ฑ์ ์ฃผ์ ๋ฐ๊ณ ์ด๋ฅผ ํ์ฉํ๋๋ก ํ๋ ๊ฒ๋๋ค.์๋ฌดํผ Join์ ๊ฑฐ๋ ์ํฉ ์์ฒด๋ ์์ ๊ฐ์ด ํด๊ฒฐํ ์ ์๋๋ฐ, ๋ฌธ์ํด ์ฃผ์ ์ง๋ฌธ์ ์ฝ์์ ๋ ์ง๋ฌธ์๋์ด ๊ถ๊ธํ ๊ฒ์ ๋จ์ํ Join์ ๊ฑฐ๋ ์ํฉ์์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ถ๋ฌ์ค๋์ง๊ฐ ๊ถ๊ธํ ๊ฒ ๊ฐ์ง ์์ต๋๋ค.์คํ๋ ค ๊ทธ๊ฒ๋ณด๋ค Fake๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ์ด๋ป๊ฒ ๋ณด์ฅํ ์ ์๋์ง๊ฐ ๊ถ๊ธํ ๊ฒ ๊ฐ์๋ฐ์. ์๋ฅผ ๋ค๋ฉด ์์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ์๋ ๋ Fake Repository๋ฅผ ํ ๋ฒ ๋ค์ ๋ณด๊ณ ์๋ด ์๋ค.https://github.com/kok202/test-code-with-architecture/blob/v2.0/src/test/java/com/example/demo/mock/FakePostRepository.javahttps://github.com/kok202/test-code-with-architecture/blob/v2.0/src/test/java/com/example/demo/mock/FakeUserRepository.javaFakePostRepository์์ Writer๋ FakeUserRepository์ data์ ์๋ ๊ฐ์ด ์๋๋๋ค. ๊ทธ๋์ FakeUserRepository์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋๋ผ๋ FakePostRepository์ ์๋ ๊ฒ์๋ฌผ์์ Writer์ ๋ณด๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๋ช ๋ฐฑํ ์ ํฉ์ฑ์ด ๊นจ์ง ์ํฉ์ ๋๋ค.์ด๋ฐ ๊ฒฝ์ฐ FakePostRepository๊ฐ FakeUserRepository๋ฅผ [์ฝ๋ a]์ ๋ง์ฐฌ๊ฐ์ง๋ก FakePostRepository๊ฐ FakeUserRepository๋ฅผ ๊ฐ๊ณ ์๊ฒ ํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ค๋ง ๊ต์ฅํ ๋ง์ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๊ณ Fake์ ๋ด๋ถ ์ฝ๋ ์์ฒด๊ฐ ๊ต์ฅํ ์ง์ ๋ถํด์ง๊ธฐ ์์ํ ๊ฒ๋๋ค.๊ทธ๋์ ๊ฒฐ๊ตญ RDB๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ํฉ์์ ํ ์ด๋ธ์ ์ฐ๊ด ๊ด๊ณ๊ฐ ๋ณต์กํ๊ฒ ์ฝํ์๋ ๊ฒฝ์ฐ ์์ ํ Fake๋ฅผ ๋ง๋ค์ด ์ด๋ฅผ ๋์ฒดํ๋๋ก ํ๋ ๊ฒ์ ๋ฌด์ฒ์ด๋ ์ด๋ ค์ด ์ผ์ ๋๋ค. ์ฌ์ค์ RDB์ ๋ชจ๋ ๊ธฐ๋ฅ์ Fake๋ก ์์ ํ ๋์ฒดํ๊ฒ ๋ค๋ ๋ชฉํ๋ ๋ฌ์ฑํ ์ ์๋ ๋ชฉํ์ ๊ฐ๊น๊ณ ์.๋ณธ ๊ฐ์์ ๋ชฉํ๋ ํ ์คํธ ํ๋ ์์ํฌ๋ h2 ์ฌ์ฉ ์์ฒด๋ฅผ ํ์ง ๋ง์๋ ๊ฒ์ ์งํฅํ๋ ๊ฒ์ด ์๋๋๋ค. ์ ์ด๋ ์ธ ๋ ์ฐ๋๋ผ๋ ํ ์คํธ ํ๋ ์์ํฌ๊ฐ ์ด๋ค ์ผ์ ๋์์ฃผ๊ณ ์๊ณ , h2 ์์ด๋ ์ด๋ป๊ฒ ํ ์คํธ๋ฅผ ๋ง๋ค ์ ์๋์ง๋ฅผ ์๋ ค๋๋ฆฌ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ํฉ์ด ์ ๋ง๋ก ๋ณต์กํ๋ค๋ฉด h2๋ stub์ ํ์ฉํด๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค!๋ง์ง๋ง์ผ๋ก ๊ฐ์ธ์ ์ผ๋ก Fake๋ฅผ ๋ง๋ค๊ธฐ ์ฌ์ธ ๋งํผ ๊ฐ์ฒด๋ ํ ์ด๋ธ ๊ด๊ณ๋ฅผ ๋ณต์กํ๊ฒ ์ ๋ง๋ค๋ ค ๋ ธ๋ ฅํฉ๋๋ค.๋ต๋ณ์ด ๋์ ๋๊ธธ ๋ฐ๋๋๋ค.
- 1
- 2
- 949
Q&A
inteface UserRepsotiroy ๋ฅผ service ํจํค์ง๋ก ๋บ ์ด์ ์๋ํด์ ๊ถ๊ธํฉ๋๋ค.
์๋ ํ์ธ์. ๊ทผ๋์ ์ฑ ์ ์งํํ ๊ธฐํ๊ฐ ์๊ฒจ ๊ทธ์ชฝ์ ํ์ ์ค์ด์ฃผ๋ค ๋ณด๋ ๋ค๋ฅธ ์ผ์ ์ ๊ฒฝ ์ฐ์ง ๋ชปํ์ต๋๋ค. ๋ต๋ณ์ด ๋ฆ์ด ์ฃ์กํฉ๋๋ค. ๋ค๋ง ํด๋น ๊ฐ์๋ ๊ณต์์ ์ผ๋ก ์ง์์๋ต์ ์ ๊ณตํ์ง ์๋ ๊ฐ์์๋ค๋ ์ ์ ์ด์ ๋ก ๋ฆ์ด์ง ๋ถ๋ถ์ ๋ํด ์ํด ๋ถํ๋๋ฆฝ๋๋ค.์ฐ์ ์ ์ ์ ์ข์ ์ต๊ด์ด ์ฎ์ ๊ฒ ๊ฐ์ ๋จผ์ ์ ์ ํด ๋๋ฆฝ๋๋ค. service ๋ ์ด์ด๊ฐ ์๋๋ผ applicaiton ๋ ์ด์ด๋ผ ๋ถ๋ฅด๋ ๊ฒ์ด ๋ง์ต๋๋ค. ์ ๊ฐ applicaiton ๋ ์ด์ด๋ฅผ service ๋ ์ด์ด๋ผ ๋ถ๋ฅด๋ ์ต๊ด์ด ์๋๋ฐ, ์ด๊ฒ ๊ฐ์์ ๊ทธ๋๋ก ์ฐํ์๋๋ผ๊ณ ์. ์ต๋ํ ๋นจ๋ฆฌ ์์ ํ๊ฒ ์ต๋๋ค;;์ง๋ฌธ ์ฃผ์ ๋ด์ฉ์ ๊ดํด์๋ ํ์์ผ๋ก ๋ฌ์์ฃผ์ ๋๊ธ์ฒ๋ผ ์ดํดํด ์ฃผ์ ๋ด์ฉ์ด ๋ง์ต๋๋ค. UserRepository๊ฐ infrastructure์ ์๋ค๋ฉด applicaiton ๋ ์ด์ด๊ฐ infrastructure ๋ ์ด์ด์ ์์กดํ๋ ๊ทธ๋ฆผ์ด ๋ฉ๋๋ค. ์ด๋ฅผ ํผํ๊ธฐ ์ํด UserRepository๋ฅผ applicaiton ๋ ์ด์ด์ ์์น์ํจ ๊ฒ์ ๋๋ค.๋ง์ผ๋ก ๋ ์ด์ด์ ์ํ ๊ด๊ณ๋ ๊ณ ์ ์ ์ด์ง ์์ต๋๋ค. ์ ํต์ ์ธ ๋ ์ด์ด๋ ์ํคํ ์ฒ๋ฅผ ์ถ๊ตฌํ๋ ๋๊ตฐ๊ฐ๋ infrastructure ๋ ์ด์ด๋ฅผ ์ตํ์ ๋ ์ด์ด๋ก ๋ด ๋๋ค. (์ฐธ์กฐ: https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html ์ฌ๊ธฐ์๋ infrastructure ๋ ์ด์ด๋ฅผ persistence layer๋ผ๊ณ ๋ณด๋ค์) ํํธ ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ฅผ ์ถ๊ตฌํ๋ ๋ ๋ค๋ฅธ ๋๊ตฐ๊ฐ๋ infrastructure ๋ ์ด์ด๋ฅผ ์ต์์ ๋ ์ด์ด๋ก ๋ด ๋๋ค. (์ฐธ์กฐ: https://medium.com/@luishrsoares/whats-hexagonal-architecture-6da22d4ab600 ์ฌ๊ธฐ์ infrastructure ๋ ์ด์ด๊ฐ ๊ฐ์ฅ ๋ฐ๊นฅ์ ์กด์ฌํ๋ค๋ ๊ฒ์ ์ ์ฌํ ๋ด์ฃผ์ธ์.)๊ทธ๋ฌ๋ ์ผ๋จ ๋ ์ด์ด๋ ์ํคํ ์ฒ์ ํ์์ ๋ฒ์ด๋๊ธธ ์ถ์ฒ๋๋ฆฝ๋๋ค. ์ ํต์ ์ธ ๋ ์ด์ด๋ ์ํคํ ์ฒ๋ ์ข ์ด์ํ ๋ถ๋ถ์ด ๋ง์ต๋๋ค.+) ์ํํธ์จ์ด ์ค๊ณ๋ฅผ ์ค๋ช ํ๋๋ฐ ํต์ฉ๋ ์ ์๋ ๋จ ํ๋์ ์์น ๊ฐ์ ๊ฒ ์๋ ๊ฒ์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด โ์์ ๋ ์ด์ด๋ ํ์ ๋ ์ด์ด๋ฅผ ์ฐธ์กฐํด์ ์ ๋๋ค.โ๋ผ๋ ์์น ํ๋๋ง์ผ๋ก ์ํํธ์จ์ด๋ฅผ ์ดํดํ๋ ค ํ๋ค ๊ฐ์ ํด ๋ด ์๋ค. ๊ทธ๋ฐ๋ฐ ์ด ์์น์ ๋ณธ ๊ฐ์์์ ์ค๋ช ํ๋ ์ํคํ ์ฒ์ ์ ์ฉํ๋ ค ๋ณด๋ฉด ๋ง์ ๋ชจ์์ด ์์ต๋๋ค.์์ ๋ ์ด์ด์ ์์นํ application ๋ ์ด์ด๊ฐ ํ์ ๋ ์ด์ด์ ์์นํ domain ๋ ์ด์ด๋ฅผ ์ฐธ์กฐํ๊ณ ์์ต๋๋ค. ๋ ํํธ ํ์ ๋ ์ด์ด์ ์์นํ infrastructure ๋ ์ด์ด๊ฐ ์์ ๋ ์ด์ด์ธ application ๋ ์ด์ด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ง๋ค๊ณ ์๊ณ ์. (๋ฌผ๋ก ์ด๋ ๋ ์ด์ด๋ ์ํคํ ์ฒ๋ฅผ ํฅ์ฌ๊ณ ๋ ์คํ์ผ์ ๋ง๊ฒ ์ฌ์ ๋ ฌํ๋ฉด์ ํด์๊ฐ ๋ฉ๋๋ค.)๋ต๋ณ์ด ๋์ ๋๊ธธ ๋ฐ๋๋๋ค.
- 2
- 3
- 886






