์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ ํ๊ธฐ๋ ๋ณด๊ณ , ํด์ปคํค๋ ํ๊ณ , ์ด๋๋ ํ๋ฉด์ ๋ฐฉํ์ ๋ณด๋๋ค. ๋ญ๊ฐ ์ข ๋ ๋ฐ์๊ฒ ์ด์์ด์ผํ๋ค๋ ์๊ฐ์ด ๋ค์์ง๋ง, ๋ด ์ธ์์์ ํ์๋์ ๋ง์ง๋ง ๋ฐฉํ์ด์ฌ์ ๋ญ๊ฐ ์ด์ ์ ๋ง ์์์ด๊ตฌ๋ ๋ผ๊ณ ์๊ฐํ๋ค. ํญ์ ๊ฑฑ์ ์ ๋ง์ ๊ฒ ๊ฐ๋ค. ์ฒซ๋ฒ์งธ๋ก ๊ด์ฐฎ์ ๊ธฐ์ ์ ๋ค์ด๊ฐ์ ๋ง์ด ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๊ณ ์ถ๋ค๋ ์๊ฐ์ ๋๋ฅผ ์ข ๋ ์ฑ์ฅ์์ผ์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค. ๋ด ํ์ ์ธ์์ ๋ง์ง๋ง ํ๊ธฐ๊ฐ ์์๋๋ค. ์กธ์ ์๊ฑด๋ ์๊ฐํ๊ณ ๋ฌผ๋ก ๋ฐฐ์ธ์์๋ ์ข์ ํ์ฌ์ ๋ค์ด๊ฐ์ ์ทจ์ ๊ณ ๋ด์ ์กธ์ ํ๋ฉด ์ต๊ณ Best๋ผ๊ณ ์๊ฐํ๋ค. ๋ง์ง๋ง 4ํ๋ 2ํ๊ธฐ๊ฐ ๋๋๊ณ ๋ด๊ฐ ์ด๋ป๊ฒ ๋์์ง ๊ถ๊ธํ๋ฉด์ ๊ฑฑ์ ๋๋ค. ์ ๋์ ์ข๊ฒ ๋ค.
Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ๊ตฌ์ฑ๋ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฌ๊ธฐ์ ๊ฐ ๊ตฌ์ฑ ์์๊ฐ ์ด๋ป๊ฒ ์ํธ์์ฉํ๋์ง ์ดํดํ๋๊ฒ์ด ์ค์ํ๋ค.
Controller : ํด๋ผ์ด์ธํธ๋ก๋ถํฐ HTTP ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๋ค.
Service : ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ ์ฅ์์ ์ํธ์์ฉํ๋ค.
Repository : ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๋ฉฐ, CRUD ์์ ์ ์ฒ๋ฆฌํ๋ค.
DTO : ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด๋ก, ๊ณ์ธต ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค.
๋ค์์ ์ผ๋ฐ์ ์ธ Spring ํ๋ก์ ํธ์ ํจํค์ง ๊ตฌ์กฐ๋ค.
config : ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ํ์ผ์ด ์์นํ๋ ํจํค์ง
controller : HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ ํด๋์ค๊ฐ ์์น
domain : ๋๋ฉ์ธ ๊ฐ์ฒด๋ค์ด ์ ์๋ ๊ณณ
repository : ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ๋ด๋นํ๋ ๋ฆฌํฌ์งํ ๋ฆฌ ํด๋์ค๊ฐ ์์น
service : ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ์๋น์ค ํด๋์ค๊ฐ ์์น
JPQL์ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ Java Persistence API์ ์ฟผ๋ฆฌ ์ธ์ด์ด๋ค. SQL๊ณผ ๋ฌธ๋ฒ์ด ๋น์ทํ์ง๋ง ํ ์ด๋ธ์ด ์๋ ์ํฐํฐ ๊ฐ์ฒด์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ค.
@PersistenceContext
EntityManager em;
public void main save(Board board) {
em.persist(board);
}
EntityManager๋ฅผ ํตํด Board ์ํฐํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋ค.
JPQL์ ์ฌ์ฉํ๋ฉด SQL๊ณผ ์ ์ฌํ๊ฒ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์กฐํํ๊ณ ์์ ํ ์ ์๋ค.
JPQL์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋๋ @Query ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ ์ ์๋ค.
@Query("SELECT c FROM ChatRoom c WHERE c.roomId = :roomId")
ChatRoom findChatRoomByRoomId(@Param("roomId") String roomId);
์ ์ฝ๋๋ ChatRoom ์ํฐํฐ์์ ํน์ roomId ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ JPQL ์ฟผ๋ฆฌ์ด๋ค.
Spring Data JPA์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด์๋ ์ค์ ํ์ผ์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์ ๋ณด๋ฅผ ์ค์ ํด์ผํ๋ค.
dependencies {
implementation'org.mariadb.jdbc:mariadb-java-client:3.1.2'
implementation'org.springframework.boot:spring-boot-starter-data-jpa'
}
-----------------------------------------------
spring:
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://localhost:8080/yourdb
username: ์ฌ์ฉ์์ด๋ฆ
password: ๋น๋ฐ๋ฒํธ
Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ด MariaDB์ ์ฐ๊ฒฐ๋๋๋ก ์ค์ ํ๋ค.
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Gyumin {
@Id
@Column(name = "Mccc_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String roomId;
private String fileName;
private String code;
// ์์ฑ์
public Gyumin(String roomId, String fileName, String code) {
this.roomId = roomId;
this.fileName = fileName;
this.code = code;
}
}
์ ํด๋์ค๋ Gyumin ์ด๋ผ๋ ์ํฐํฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ปฌ๋ผ๊ณผ ๋งคํ๋๋ค. ๊ฐ ํ๋๋ id, roomId, fileName, code์ ๊ฐ์ด ์ ์๋์๊ณ @Id๋ก ๊ธฐ๋ณธ ํค๊ฐ ์ง์ ๋์๋ค.
JPA์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ Repository ํจํด์ ์ฌ์ฉํ๋ค. SnapshotRespository ์ธํฐํ์ด์ค๋ MongoDB์ JPA๋ฅผ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋ค.
public interface SnapshotRepository extends MongoRepository<Snapshot, String> {
Snapshot findByRoomId(String roomId);
List<Snapshot> findSnapshotsByRoomId(String roomId);
Snapshot findByRoomIdAndFileName(String roomId, String fileName);
}
์ ์ฝ๋๋ SnapshotRepository๋ฅผ ํตํฐ roomId๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋ค. findByRoomId๋ roomId ๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ธฐ๋ฅ์ ์ํํ๋ฉฐ findSnapshotsByRoomId๋ ๋์ผํ roomId๋ก ์ฌ๋ฌ ๊ฐ์ Snapshot ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ค.
JPA์์๋ @Query ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ JPQL ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ ์ ์๋ค.
public interface ManageRepository extends JpaRepository<Manage, Long> {
@Query("select m from Manage m " +
"where m.team.id = :teamId " +
"order by m.createDate")
List<Manage> findManagesByTeamId(@Param("teamId") Long teamId);
}
์ ์ฝ๋์์๋ @Query ์ด๋ ธํ ์ด์ ์ ํตํด ์ง์ JPQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์๊ณ , teamId ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ์ฌ team.id์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ค. @Param ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ธ๋ฉํ๋ค.
๋ฒํฌ์ฑ ์ฟผ๋ฆฌ๋ ๋ค์์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ค. ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ญ์ ํ ๋ ์ฑ๋ฅ ์ต์ ํ์ ์ ๋ฆฌํ๋ค.
@Modifying
@Query("UPDATE Member m SET m.age = m.age + 1 WHERE m.age >= :age")
int bulkUpdateAge(@Param("age") int age);
์ ์ฟผ๋ฆฌ๋ age ๊ฐ์ด ์ผ์ ์์ค ์ด์์ธ ํ์๋ค์ ๋์ด๋ฅผ ์ผ๊ด์ ์ผ๋ก 1์ฉ ์ฆ๊ฐ์ํค๋ ๋ฒํฌ ์ ๋ฐ์ดํธ ์ฟผ๋ฆฌ์ด๋ค. @Modifying ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํธ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.