Skip to content

Commit 6ef5cf8

Browse files
authored
Merge pull request #55 from prgrms-web-devcourse-final-project/feat/54-law
feat[law]: 판례, 법령 controller, service, repository 추가
2 parents ece7d0d + 4d0ee58 commit 6ef5cf8

21 files changed

+1034
-0
lines changed

backend/build.gradle

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ plugins {
22
id 'java'
33
id 'org.springframework.boot' version '3.5.5'
44
id 'io.spring.dependency-management' version '1.1.7'
5+
6+
id("org.jetbrains.kotlin.jvm") version "1.9.25"
7+
id("com.google.devtools.ksp") version "1.9.25-1.0.20"
58
}
69

710
group = 'com.ai.lawyer'
@@ -57,6 +60,10 @@ dependencies {
5760
// Annotation Processing (어노테이션 처리)
5861
annotationProcessor 'org.projectlombok:lombok'
5962

63+
// Querydsl
64+
implementation("io.github.openfeign.querydsl:querydsl-jpa:7.0")
65+
ksp("io.github.openfeign.querydsl:querydsl-ksp-codegen:7.0")
66+
6067
// Testing (테스트)
6168
testImplementation 'org.springframework.boot:spring-boot-starter-test'
6269
testImplementation 'org.springframework.security:spring-security-test'
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.ai.lawyer.domain.law.controller;
2+
3+
import com.ai.lawyer.domain.law.dto.LawSearchRequestDto;
4+
import com.ai.lawyer.domain.law.dto.LawsDto;
5+
import com.ai.lawyer.domain.law.entity.Law;
6+
import com.ai.lawyer.domain.law.service.LawService;
7+
import com.ai.lawyer.global.dto.PageResponseDto;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.data.domain.Page;
10+
import org.springframework.http.ResponseEntity;
11+
import org.springframework.web.bind.annotation.*;
12+
13+
@RestController
14+
@RequiredArgsConstructor
15+
@RequestMapping("/law")
16+
public class LawController {
17+
18+
private final LawService lawService;
19+
20+
// 법령 리스트 출력
21+
@GetMapping(value = "/list")
22+
public ResponseEntity<?> list(
23+
@RequestParam String query,
24+
@RequestParam int page
25+
) throws Exception {
26+
String lawList = lawService.getLawList(query, page);
27+
return ResponseEntity.ok().body(lawList);
28+
}
29+
30+
31+
@GetMapping(value = "/list/save")
32+
public ResponseEntity<?> getStatisticsCard(
33+
@RequestParam String query,
34+
@RequestParam int page
35+
) throws Exception {
36+
long startTime = System.currentTimeMillis();
37+
38+
lawService.saveLaw(query, page);
39+
40+
long endTime = System.currentTimeMillis();
41+
long elapsedTime = endTime - startTime;
42+
System.out.println("saveLaw 실행 시간: " + elapsedTime + "ms");
43+
44+
return ResponseEntity.ok().body("Success");
45+
}
46+
47+
@GetMapping("/{id}")
48+
public ResponseEntity<Law> getFullLaw(@PathVariable Long id) {
49+
Law law = lawService.getLawWithAllChildren(id);
50+
51+
return ResponseEntity.ok(law);
52+
}
53+
54+
55+
@PostMapping("/search")
56+
public ResponseEntity<PageResponseDto> searchLaws(@RequestBody LawSearchRequestDto searchRequest) {
57+
Page<LawsDto> laws = lawService.searchLaws(searchRequest);
58+
PageResponseDto response = PageResponseDto.builder()
59+
.content(laws.getContent())
60+
.totalElements(laws.getTotalElements())
61+
.totalPages(laws.getTotalPages())
62+
.pageNumber(laws.getNumber())
63+
.pageSize(laws.getSize())
64+
.build();
65+
return ResponseEntity.ok(response);
66+
}
67+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.ai.lawyer.domain.law.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Data;
5+
6+
import java.time.LocalDate;
7+
8+
@Data
9+
@Builder
10+
public class LawSearchRequestDto {
11+
private String lawName; // 법령명
12+
private String lawField; // 법령분야
13+
private String ministry; // 소관부처
14+
private LocalDate promulgationDateStart; // 공포일자 시작
15+
private LocalDate promulgationDateEnd; // 공포일자 종료
16+
private LocalDate enforcementDateStart; // 시행일자 시작
17+
private LocalDate enforcementDateEnd; // 시행일자 종료
18+
private int pageNumber; // 페이지 번호
19+
private int pageSize; // 페이지 크기
20+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.ai.lawyer.domain.law.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
7+
import java.time.LocalDate;
8+
9+
@Data
10+
@Builder
11+
@AllArgsConstructor
12+
public class LawsDto {
13+
private Long id;
14+
15+
private String lawName; // 법령명
16+
17+
private String lawField; // 법령분야
18+
19+
private String ministry; // 소관부처
20+
21+
private String promulgationNumber; // 공포번호
22+
23+
private LocalDate promulgationDate; // 공포일자
24+
25+
private LocalDate enforcementDate; // 시행일자
26+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.ai.lawyer.domain.law.repository;
2+
3+
import com.ai.lawyer.domain.law.entity.Hang;
4+
import org.springframework.data.jpa.repository.EntityGraph;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.stereotype.Repository;
7+
8+
import java.util.List;
9+
10+
@Repository
11+
public interface HangRepository extends JpaRepository<Hang, Long> {
12+
13+
// Hang + Ho만 페치
14+
@EntityGraph(attributePaths = "hoList")
15+
List<Hang> findByJoId(Long joId);
16+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.ai.lawyer.domain.law.repository;
2+
3+
import com.ai.lawyer.domain.law.entity.Ho;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
@Repository
8+
public interface HoRepository extends JpaRepository<Ho, Long> {
9+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.ai.lawyer.domain.law.repository;
2+
3+
import com.ai.lawyer.domain.law.entity.Jang;
4+
import org.springframework.data.jpa.repository.EntityGraph;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.stereotype.Repository;
7+
8+
import java.util.List;
9+
10+
@Repository
11+
public interface JangRepository extends JpaRepository<Jang, Long> {
12+
// Jang + Jo만 페치
13+
@EntityGraph(attributePaths = "joList")
14+
List<Jang> findByLawId(Long lawId);
15+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.ai.lawyer.domain.law.repository;
2+
3+
import com.ai.lawyer.domain.law.entity.Jo;
4+
import org.springframework.data.jpa.repository.EntityGraph;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.stereotype.Repository;
7+
8+
import java.util.List;
9+
10+
@Repository
11+
public interface JoRepository extends JpaRepository<Jo, Long> {
12+
13+
// Jo + Hang만 페치
14+
@EntityGraph(attributePaths = "hangList")
15+
List<Jo> findByJangId(Long jangId);
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.ai.lawyer.domain.law.repository;
2+
3+
import com.ai.lawyer.domain.law.entity.Law;
4+
import org.springframework.data.jpa.repository.EntityGraph;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.stereotype.Repository;
7+
8+
import java.util.Optional;
9+
10+
@Repository
11+
public interface LawRepository extends JpaRepository<Law, Long>, LawRepositoryCustom {
12+
13+
// Law + Jang만 페치
14+
@EntityGraph(attributePaths = "jangList")
15+
Optional<Law> findWithJangById(Long id);
16+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.ai.lawyer.domain.law.repository;
2+
3+
import com.ai.lawyer.domain.law.dto.LawSearchRequestDto;
4+
import com.ai.lawyer.domain.law.dto.LawsDto;
5+
import org.springframework.data.domain.Page;
6+
7+
public interface LawRepositoryCustom {
8+
Page<LawsDto> searchLaws(LawSearchRequestDto searchRequest);
9+
}

0 commit comments

Comments
 (0)