ํด๋ฆญ ์ ์ด๋ํฉ๋๋ค. ์์ํ 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..
๋ณตํฉ ํค(Composite Key) ์ฌ๋ฌ ์ด์ ์กฐํฉํ์ฌ ๊ธฐ๋ณธ ํค(Primary Key)์ ์ญํ ์ ํ ์ ์๋๋ก ๋ง๋ ํค๋ฅผ ์๋ฏธํฉ๋๋ค. ์๋ณ ๊ด๊ณ ๋ถ๋ชจ ํ
์ด๋ธ์ ๊ธฐ๋ณธ ํค๋ฅผ ๋ด๋ ค๋ฐ์์ ์์ ํ
์ด๋ธ์ ๊ธฐ๋ณธ ํค + ์ธ๋ ํค๋ก ์ฌ์ฉํ๋ ๊ด๊ณ์
๋๋ค. ๋น์๋ณ ๊ด๊ณ ๋ถ๋ชจ ํ
์ด๋ธ์ ๊ธฐ๋ณธ ํค๋ฅผ ์์ ํ
์ด๋ธ์ ์ธ๋ ํค๋ก๋ง ์ฌ์ฉํ๋ ๊ด๊ณ์
๋๋ค. ๋น์๋ณ ๊ด๊ณ๋ ํ์์ ๋น์๋ณ ๊ด๊ณ์ ์ ํ์ ๋น์๋ณ ๊ด๊ณ๊ฐ ์์ต๋๋ค. ํ์์ ๋น์๋ณ ๊ด๊ณ(Mandatory) ์ธ๋ ํค์ NULL์ ํ์ฉํ์ง ์์ต๋๋ค. ์ฐ๊ด๊ด๊ณ๋ฅผ ๋ฐ๋์ ๋งบ์ด์ผ ํฉ๋๋ค. ์ ํ์ ๋น์๋ณ ๊ด๊ณ(Optional) ์ธ๋ ํค์ NULL์ ํ์ฉํฉ๋๋ค. ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์์ง ๋ง์ง ์ ํํ ์ ์์ต๋๋ค. ์๋ณ ๊ด๊ณ์ ๋น์๋ณ ๊ด๊ณ์ ์ ํ ์ต๊ทผ์๋ ๋น์๋ณ ๊ด๊ณ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๊ณ ๊ผญ ํ์ํ ๊ณณ์๋ง ..
์ ๋ ์ง๊ธ๊น์ง ์ผ๋ฐ์ ์ผ๋ก JPA๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ @Id์ @GenerateValue, ๊ทธ๋ฆฌ๊ณ Long ํ์
์ id๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ํญ์ id๋ ์ง์ ํ ๋นํ์ง ์์๊ธฐ์ save()์ id์ ๊ฐ์ ํญ์ null์ด์์ต๋๋ค. ๊ทธ๋ฌ๋ค ์ฝํ๋ฆฐ์ ๊ณต๋ถํ๊ณ , ์ฝํ๋ฆฐ์ผ๋ก JPA๋ฅผ ์ฌ์ฉํด๋ณด๋ ค๋ ์ค, ์ฝํ๋ฆฐ์์ id์ null์ ํ์ฉํ๊ฒ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด ์ฝ๋๊ฐ ๋๋ฌด ๋๋ฌ์์ง ๊ฒ ๊ฐ์์, null์ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด์์ต๋๋ค. ์๊ฐ๋ณด๋ค ๊ฐ๋จํ๋๋ฐ ๊ฒฐ๋ก ์ 0์ผ๋ก ์ด๊ธฐํ ์์ผ์ฃผ๋ฉด ๋๋ค์์ต๋๋ค. ํน์ nullable ํ์
์ ์ฌ์ฉํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์
๋๋ค. ์ด์ ๋ถํฐ ์ด๋ฌํ ์ด์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. save()๋ ์ด๋ป๊ฒ ์๋ํ ๊น? ์ ์ฅํ๋ ค๋ ์ํฐํฐ๊ฐ ์๋ก์ด ์ํฐํฐ์ธ ๊ฒฝ์ฐ persist๋ฅผ, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ merge๋ฅผ ์ง..
๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ํ์ง๋ ์์ ์ ์์ง๋ง, ์ ์ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ dialect(๋ฐฉ์ธ)์ด ๋ฌธ์ ์์ต๋๋ค. ์ application.properties ์์๋ ๋ค์๊ณผ ๊ฐ์ด dialect๊ฐ ์ค์ ๋์ด ์์๊ณ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect ์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ณ ์ณ์ฃผ๋ ์ค๋ฅ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect ์ฐธ๊ณ - MySQL ์คํ ๋ฆฌ์ง ์์ง ์ข
๋ฅ์ ํน์ง https://nomadlee.com/mysql-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EC%97%94%EC%..
๋ฌธ์ ์ํฉ์ ๊ฐ๋จํ๊ฒ ๋ํ๋ด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.. TestEntity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class TestEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "test_id") private Long id; private String name; } TestRepository public interface TestRepository extends JpaRepository { } TestService @Service @RequiredArgsConstructor @Transactional pu..