๐Ÿ๏ธ Spring

(Lock ์— ๋Œ€ํ•ด์„œ๋Š” ์ œ๊ฐ€ ์•„์ง ๊ณต๋ถ€๋ฅผ ์ž˜ ๋ชปํ•˜์—ฌ์„œ, ์ดํ›„ ์ •๋ฆฌํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค) Data JPA์—์„œ์˜ Lock ์„ค์ • @Lock์„ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ interface MemberRepository : JpaRepository { @Lock(LockModeType.PESSIMISTIC_WRITE) fun findByUsername(username: String): Member? } ์ง€์›ํ•˜๋Š” Lock์˜ ์ข…๋ฅ˜ ํ•ด๋‹น LockModeType์˜ ํŒจํ‚ค์ง€๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰ Lock์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ JPA์˜ ํ‘œ์ค€ ์ŠคํŽ™์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @Lock์„ ํ†ตํ•ด ํ•ด๋‹น ์„ค์ •์„ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์€ Data JPA์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. Reference ์‹ค์ „! ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA - ์ธํ”„..
JPA Hint JPA ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋Šฅ์ด ์•„๋‹Œ ์–ด๋– ํ•œ ๊ตฌํ˜„์ฒด๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์˜ˆ์‹œ๋Š” JPA์˜ ๊ตฌํ˜„์ฒด์ธ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ์˜ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ฝ๊ธฐ ์ „์šฉ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์กฐํšŒํ•˜์—ฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ ์ „์šฉ ์ฟผ๋ฆฌ ๋งŒ๋“ค๊ธฐ public interface MemberRepository extends JpaRepository { @QueryHints ( value=@QueryHint(name = "org.hibernate.readOnly", value = "true") ) Member findReadOnlyByUsername(String username); } Reference ์‹ค์ „! ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” ๊ธฐ์กด..
@EntityGraph JPQL์˜ ํŽ˜์น˜ ์กฐ์ธ์„ ์กฐ๊ธˆ ๋” ํŽธํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ DATA JPA์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. @EntityGraph(attributePaths = {"ํŽ˜์น˜์กฐ์ธํ•  ์—”ํ‹ฐํ‹ฐ ํ•„๋“œ๋ช… 1", "ํ•„๋“œ๋ช… 2", ...}) ์˜ˆ์‹œ @Entity @Getter @Table(name = "member") class Member { @Id @Column(name = "member_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team;..
๋ฒŒํฌ ์—ฐ์‚ฐ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ JPA๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ executeUpdate()๋ฅผ ํ†ตํ•ด ๋ฒŒํฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ํšŒ์›์˜ ๋‚˜์ด๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ˆœ์ˆ˜ JPA๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. int resultCount = em.createQuery("update Member m set m.age = m.age").executeUpdate() Spring Data JPA์—์„œ์˜ ๋ฒŒํฌ ์—ฐ์‚ฐ @Modifying์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. public interface MemberRepository extends JpaRepository { @Modifying @Query("update Member m set m.age = m.a..
ํด๋ฆญ ์‹œ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•œ JPA DATA JPA QueryDSL ์ˆœ์ˆ˜ JPA ์—์„œ์˜ ํŽ˜์ด์ง• ๋‹ค์Œ ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง•์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค setFirstResult(int startPosition) : ์กฐํšŒ ์‹œ์ž‘ ์œ„์น˜, 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. setMaxResult(int maxResult) : ์กฐํšŒํ•  ๋ฐ์ดํ„ฐ ์ˆ˜ setFirstResult๋Š” ํŽ˜์ด์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ์กฐํšŒ๋ฅผ ์‹œ์ž‘ํ•  row์˜ ์œ„์น˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ ์ฝ”๋“œ em.createQuery("select m from Member m where m.age = :age order by m.username desc", Member.class) .setParameter("age", age) .setFirstResult(0) //์‹œ์ž‘ ์œ„์น˜ ์ง€์ • .setMax..
JPA์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์˜ ์ข…๋ฅ˜ Data JPA์—์„œ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ˜ํ™˜ ํƒ€์ž…๋“ค์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. List : ์ปฌ๋ ‰์…˜, ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Member : ๋‹จ๊ฑด(๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ null, ๊ฒฐ๊ณผ๊ฐ€ 2๊ฐœ์ด๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.) Optional : ๋‹จ๊ฑด optional(๊ฒฐ๊ณผ๊ฐ€ 2๊ฐœ์ด๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค) ... https://docs.spring.io/spring-data/jpa/docs/2.3.0.RELEASE/reference/html/#repository-query-return-types Spring Data JPA - Reference Documentation Example 108. Using @Transactional at query methods @T..
์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ ๊ธฐ๋Šฅ์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์ฟผ๋ฆฌ ์ƒ์„ฑ @Query๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฆฌํŒŒ์ง€ํ† ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค์— ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ •์˜ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์œผ๋กœ ์ฟผ๋ฆฌ ์ƒ์„ฑ Optional findByUsername(String username); ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„๋งŒ ์„ค์ •ํ•จ์œผ๋กœ์จ ์ฟผ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์—”ํ‹ฐํ‹ฐ์— ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, ํ•„๋“œ๋ช…๊ณผ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋ฐ˜๋“œ์‹œ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋Š”๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ์ ์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ˆ ์–ด https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#appendix.query.method.subje..
์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA์—์„œ ์ถ”์ƒํ™”์˜ ์ค‘์‹ฌ์ด ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” Repository ์ž…๋‹ˆ๋‹ค. Repository๋Š” ๊ด€๋ฆฌํ•  ๋„๋ฉ”์ธ ํด๋ž˜์Šค์™€, ๋„๋ฉ”์ธ ํด๋ž˜์Šค์˜ ID(์‹๋ณ„์ž)๋ฅผ ํƒ€์ž… ์ธ์ž๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. @NoRepositoryBean public interface CrudRepository extends Repository { S save(S entity); Iterable saveAll(Iterable entities); Optional findById(ID id); boolean existsById(ID id); Iterable findAll(); Iterable findAllById(Iterable ids); long count(); void deleteById(ID id); v..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (7 Page)