์ด๋ฒ์ Exception์ ๋ํด์ ๊ณต๋ถ๋ฅผ ์ข ํ๋ค๊ฐ ์ง๊ธ๊น์ง ๋ชจ๋ฅด๊ณ ์ญ ์ฌ์ฉํ์๋ ์ค์ํ ์ฌ์ค์ ์์๋ฒ๋ ธ์ต๋๋ค. (์ด๊ฒ๋ ๋ชจ๋ฅด๊ณ ๋ฌด์ง์ฑ์ผ๋ก ์ฌ์ฉํ์๋ค๋..ใ
ใ
์ฐธ.. ์ด๋ฌ๋ฉด์ ์ฑ์ฅํ๋ ๊ฑฐ๊ฒ ์ฃ ..) ์ฐ์ ์ ๋ง ๊ฐ๋จํ๊ฒ Checked Exception๊ณผ Unchecked Exception์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. Checked Exception์ Exception์ ํ์ ์์ธ๋ค ์ค RuntimeException์ ์ ์ธํ ๋ชจ๋ ์์ธ๋ค์ Checked Exception์ด๋ผ ํฉ๋๋ค. Checked Exception์ ์ปดํ์ผ ์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์๋ก ํด์ฃผ์ด์ผ ํ๋ฉฐ, ํด์ฃผ์ง ์๋๋ค๋ฉด ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค. ์ด์๋ ๋์กฐ์ ์ผ๋ก Unchecked Exception์ RuntimeException๊ณผ ์ด๋ฅผ ์์๋ฐ์ ..
๐๏ธ Spring/JPA
JPA ๊ตฌํ์ฒด๋ก ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ์ฐ์ ๋ค๋ฉด ์ฃผ์ํด์ผ ํ ์ ์ด ์์ต๋๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋๋ ์ํฉ์ ๊ฐ๋ตํ ์ฝ๋๋ก ๋ํ๋ด์ด ๋ณด๊ฒ ์ต๋๋ค. @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "member") public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; public void set..
์์ ๋ถํฐ @Transaction์ด ์ค์ฒฉ๋์ ์ฌ์ฉ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น..?? ๋ผ๊ณ ๋ช๋ฒ ์๊ฐํด ๋ณด์๊ณ , ๊ทธ๋ ๋์ถฉ ์ดํด๋ณด๊ณ ๋ง์์๋๋ฐ, ์ค๋ ์ด์ฉ๋ค๊ฐ ์ด๊ฒ ๊ด๋ จํด์ ์กฐ๊ธ ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ด ์๊ฒจ์ (์ฌ์ค์ ์ข
ํ๋์ด ์ธ๊ธํด์ฃผ์ ๊ฑฐ๊ธด ํ์ง๋ง) ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค. ์ฌ์ค ์ด ๊ธ์ ์ดํ ๋ค๋ฃฐ (์ค์ฒฉ๋) ํธ๋์ญ์
์์์ ์์ธ์ฒ๋ฆฌ์ ๋ํด ๊ธ์ ์์ ํ ๋ ์๊ณ ์์ด์ผ ํ ๋ด์ฉ์ด๊ธฐ์ ๊ฐ๋จํ๊ฒ๋ง ๋ค๋ฃจ๊ณ ๋ค์ ๊ฒ์๋ฌผ๋ก ๋์ด๊ฐ๊ฒ ๋ค. ์ฌ๊ธฐ์๋ @Transactional์ propagation ์์ฑ์ ๋ํด์ ์์๋ณด์. Propagation(์ ํ) ์์ฑ ์คํ๋ง์ Propagation์ ์์ฑ์ ๋ค์๊ณผ ๊ฐ๋ค. REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), SUPPORTS(TransactionDefi..
JPA ํ์ค ์์ธ ์ฒ๋ฆฌ JPA์ ํ์ค ์์ธ๋ค์ javax.persistence.PersistenceException์ ์์ ํด๋์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์์ธ ํด๋์ค๋ RuntimeException์ ์์์ด๋ค. JPA ํ์ค ์์ธ๋ ํฌ๊ฒ ๋ณด๋ฉด 2๊ฐ์ง๋ก ๋๋ ์ ์๋ค. ํธ๋์ญ์
๋กค๋ฐฑ์ ํ์ํ๋ ์์ธ ํธ๋์ญ์
์์ธ๋ฅผ ํ์ํ์ง ์๋ ์์ธ ํธ๋์ญ์
๋กค๋ฐฑ์ ํ์ํ๋ ์์ธ๋ ์ฌ๊ฐํ ์์ธ์ด๋ฏ๋ก ๋ณต๊ตฌํด์๋ ์๋๋ค. ์ด ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋์ญ์
์ ๊ฐ์ ๋ก ์ปค๋ฐํด๋ ํธ๋์ญ์
์ด ์ปค๋ฐ๋์ง ์๊ณ ๋์ ์ javax.persistence.RollbackException ์์ธ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ฉด์ ํธ๋์ญ์
๋กค๋ฐฑ์ ํ์ํ์ง ์๋ ์์ธ๋ ์ฌ๊ฐํ ์์ธ๊ฐ ์๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๊ฐ ํธ๋์ญ์
์ ์ปค๋ฐํ ์ง ๋กค๋ฐฑํ ์ง๋ฅผ ํ๋จํ๋ค. ์๋๋ ๋ ๊ฐ์ง ๋ถ๋ฅ์ ์์ธ๋ฅผ ํ..
๋ฆฌ์ค๋ ๋ชจ๋ ์ํฐํฐ๋ฅผ ๋์์ผ๋ก ์ธ์ ์ด๋ค ์ฌ์ฉ์๊ฐ ์ญ์ ๋ฅผ ์์ฒญํ๋์ง ๋ชจ๋ ๋ก๊ทธ๋ก ๋จ๊ฒจ์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ์๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ญ์ ๋ก์ง์ ํ๋ ํ๋ ์ฐพ์๊ฐ๋ฉฐ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ๊ฒ์ ๋๋ฌด ๋นํจ์จ์ ์ด๋ค. ์ด๋ด ๋ JPA์ ๋ฆฌ์ค๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด, ์ํฐํฐ์ ์๋ช
์ฃผ๊ธฐ์ ๋ฐ๋ฅธ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ฒคํธ์ ์ข
๋ฅ ์ด๋ฒคํธ์ ์ข
๋ฅ์ ๋ฐ์ ์์ ์ ๋ค์๊ณผ ๊ฐ๋ค. PostLoad : ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ
์คํธ์ ์กฐํ๋ ์งํ, ๋๋ refresh๋ฅผ ํธ์ถํ ํ(2์ฐจ ์บ์์ ์ ์ฅ๋์ด ์์ด๋ ํธ์ถ๋๋ค.) PrePersist : persist() ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์ ๊ด๋ฆฌํ๊ธฐ ์ง์ ์ ํธ์ถ๋๋ค. ์๋ณ์ ์์ฑ ์ ๋ต์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์ํฐํฐ์ ์๋ณ์๋ ์กด์ฌํ์ง ์๋ ์ํ์ด๋ค. ์๋ก์ด ์ธ์คํด์ค๋ฅผ mer..
@Converter ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ํฐํฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณํ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ์ ์๋ค. ์๋ฅผ ๋ค์ด์ ํ์์ VIP์ฌ๋ถ๋ฅผ ์๋ฐ์ boolean ํ์
์ ์ฌ์ฉํ๊ณ ์ถ๋ค๊ณ ํ์. JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฐ์ boolean ํ์
์ ๋ฐฉ์ธ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ 0 ๋๋ 1๋ก ์ ์ฅ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ซ์ ๋์ Y ๋๋ N์ผ๋ก ์ ์ฅํ๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น? ๊ทธ๋ด ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ๋ฐ๋ก ์ปจ๋ฒํฐ๋ค. ์ฌ์ฉ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; ..
์ปฌ๋ ์
JPA์์๋ ์๋ฐ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ Collection, List, Set, Map ์ปฌ๋ ์
์ ์ง์ํ๊ณ ๋ค์ ๊ฒฝ์ฐ์ ์ด ์ปฌ๋ ์
์ ์ฌ์ฉํ ์ ์๋ค. @OneToMany, @ManyToMany ๋ฅผ ์ฌ์ฉํด์ '์ผ๋๋ค' ํน์ '๋ค๋๋ค' ์ํฐํฐ ๊ด๊ณ๋ฅผ ๋งคํํ ๋. @ElementCollection์ ์ฌ์ฉํด์ ๊ฐ ํ์
์ ํ๋ ์ด์ ๋ณด๊ดํ ๋ ์ฐ์ ์๋ฐ ์ปฌ๋ ์
์ธํฐํ์ด์ค์ ํน์ง์ ๊ฐ๋จํ ์ดํด๋ณด๊ณ ๊ฐ์. ์๋ฐ ์ปฌ๋ ์
์ธํฐํ์ด์ค์ ํน์ง Collection : ์๋ฐ๊ฐ ์ ๊ณตํ๋ ์ต์์ ์ปฌ๋ ์
์ด๋ค. List : ์์๊ฐ ์๊ณ , ์ค๋ณต์ ํ์ฉํ๋ค. Set : ์์๊ฐ ์๊ณ , ์ค๋ณต์ ํ์ฉํ์ง ์๋๋ค Map : Key, Value๋ก ๋์ด์์ผ๋ฉฐ ํค๋ ์ค๋ณต์ ๋ถํํ๋ค. JPA์ ์ปฌ๋ ์
JPA ๋ช
์ธ์๋ ์๋ฐ ์ปฌ๋ ์
์ธํฐํ์ด์ค์ ๋..
@OrderBy @OrderColumn์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์์ฉ ์ปฌ๋ผ์ ๋งคํํด์ ๊ด๋ฆฌํ๋ค๋ฉด, @OrderBy๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ORDER BY ์ ์ ์ฌ์ฉํด์ ์ปฌ๋ ์
์ ์ ๋ ฌํ๋ค. ๋ฐ๋ผ์ ์์์ฉ ์ปฌ๋ผ์ ๋งคํํ ํ์๋ ์๊ณ , ๋ํ @OrderBy๋ ๋ชจ๋ ์ปฌ๋ ์
์ ์ฌ์ฉํ ์ ์๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์์๋ณด์. @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @OneToMany(mappedBy = "member") @OrderBy("id asc, completedDate desc") private ..