diff --git a/ad/.gitignore b/ad/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/ad/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/ad/build.gradle b/ad/build.gradle new file mode 100644 index 0000000..5a4fb54 --- /dev/null +++ b/ad/build.gradle @@ -0,0 +1,8 @@ +bootJar { + enabled = true +} +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} \ No newline at end of file diff --git a/ad/src/main/java/com/cnu/ad/Main.java b/ad/src/main/java/com/cnu/ad/Main.java new file mode 100644 index 0000000..97d357f --- /dev/null +++ b/ad/src/main/java/com/cnu/ad/Main.java @@ -0,0 +1,11 @@ +package com.cnu.ad; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Main { + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } +} \ No newline at end of file diff --git a/ad/src/main/java/com/cnu/ad/controller/AddController.java b/ad/src/main/java/com/cnu/ad/controller/AddController.java new file mode 100644 index 0000000..7b791c3 --- /dev/null +++ b/ad/src/main/java/com/cnu/ad/controller/AddController.java @@ -0,0 +1,17 @@ +package com.cnu.ad.controller; + +import com.cnu.ad.model.Advertisement; +import com.cnu.ad.service.AdService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/ads") +@RequiredArgsConstructor +public class AddController { + private final AdService adService; + @GetMapping + public Advertisement getAd(){ return adService.getAd(); } +} diff --git a/ad/src/main/java/com/cnu/ad/model/Advertisement.java b/ad/src/main/java/com/cnu/ad/model/Advertisement.java new file mode 100644 index 0000000..3ba6f06 --- /dev/null +++ b/ad/src/main/java/com/cnu/ad/model/Advertisement.java @@ -0,0 +1,10 @@ +package com.cnu.ad.model; + + +public record Advertisement( + String title, + String description, + String imageUrl, + String siteUrl +) { +} diff --git a/ad/src/main/java/com/cnu/ad/service/AdService.java b/ad/src/main/java/com/cnu/ad/service/AdService.java new file mode 100644 index 0000000..66635f2 --- /dev/null +++ b/ad/src/main/java/com/cnu/ad/service/AdService.java @@ -0,0 +1,24 @@ +package com.cnu.ad.service; + +import com.cnu.ad.model.Advertisement; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Random; + +@Service +public class AdService { + private final List ads = List.of( + new Advertisement("구글 개발자 채용", "구글코리아에서 우수한 인재들을 모집합니다", "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png", "https://www.google.com"), + new Advertisement("나이키 멤버십 빅 세일", "오직 나이키 멤버십을 위한 단 3일! 새학기 설레는 마음을 조던과 함께", "https://www.google.com/imgres?imgurl=https%3A%2F%2Fcdn.eyesmag.com%2Fcontent%2Fuploads%2FsliderImages%2F2020%2F12%2F24%2Fair-jordan-1-ko-chicago-01-406abe1e-0ef2-4b71-b479-7716fdb60630.jpg&tbnid=QyvBKpDwO_UoBM&vet=12ahUKEwjA0KXhva7-AhXnplYBHaWYA2cQMygAegUIARCMAg..i&imgrefurl=https%3A%2F%2Fwww.eyesmag.com%2Fposts%2F133372%2Fair-jordan-1-ko-chicago&docid=sYwmVvloa4MEMM&w=903&h=600&q=%EC%A1%B0%EB%8D%98&ved=2ahUKEwjA0KXhva7-AhXnplYBHaWYA2cQMygAegUIARCMAg", "https://www.nike.com/kr"), + new Advertisement("충남대학교 컴퓨터공학 대학원생 상반기 모집", "충남대학교 컴퓨터공학 대학원생 상반기 모집을 시작합니다. 자세한 사항은 홈페이지를 참고해주세요.", "https://www.google.com/imgres?imgurl=https%3A%2F%2Fplus.cnu.ac.kr%2FUpl%2F_board%2Fsub07_0703%2Fsub07_0703_0_1625820900.jpg&tbnid=25yHUTidQqon-M&vet=12ahUKEwinxujGva7-AhVVplYBHfSXBE4QMygDegUIARDMAQ..i&imgrefurl=https%3A%2F%2Fplus.cnu.ac.kr%2F_prog%2F_board%2F%3Fmode%3DV%26no%3D2480211%26code%3Dsub07_0703%26site_dvs_cd%3Dkr%26menu_dvs_cd%3D0703%26skey%3D%26sval%3D%26site_dvs%3D%26ntt_tag%3D%26GotoPage%3D&docid=nUktNpfW-pncMM&w=2048&h=1215&q=%EC%B6%A9%EB%82%A8%EB%8C%80%ED%95%99%EA%B5%90&ved=2ahUKEwinxujGva7-AhVVplYBHfSXBE4QMygDegUIARDMAQ", "https://plus.cnu.ac.kr/html/kr/"), + new Advertisement("쿠팡 와우회원 1만원 할인", "오직 쿠팡 와우회원에게만 주어지는 마지막 기회! 1만원 할인 쿠폰을 받아보세요.", "https://www.google.com/imgres?imgurl=https%3A%2F%2Fimage10.coupangcdn.com%2Fimage%2Fmobile%2Fv3%2Fimg_fb_like.png&tbnid=9tak8zDG-dGaMM&vet=12ahUKEwip6-2Rvq7-AhVflFYBHRiADfwQMygAegUIARDbAQ..i&imgrefurl=https%3A%2F%2Fwww.coupang.com%2F&docid=Qqxdvidhpoqf-M&w=512&h=512&itg=1&q=%EC%BF%A0%ED%8C%A1&ved=2ahUKEwip6-2Rvq7-AhVflFYBHRiADfwQMygAegUIARDbAQ", "https://www.coupang.com/"), + new Advertisement("네이버 쇼핑에서 후기쓰고 포인트 적립하자~", "믿고보는 네이버 쇼핑 후기! 후기쓰고 포인트 적립하자~", "https://www.google.com/imgres?imgurl=https%3A%2F%2Fcenter.shopping.naver.com%2Fimg%2Fimg_main_carousel.jpg&tbnid=4w-j7Xc4PzwJ5M&vet=12ahUKEwjw--fKvq7-AhV9klYBHQ8QAZYQMygAegUIARCIAQ..i&imgrefurl=https%3A%2F%2Fcenter.shopping.naver.com%2F&docid=oZ5oXq3Zhw_iFM&w=2050&h=1478&q=%EB%84%A4%EC%9D%B4%EB%B2%84%20%EC%87%BC%ED%95%91&ved=2ahUKEwjw--fKvq7-AhV9klYBHQ8QAZYQMygAegUIARCIAQ", "https://www.naver.com/"), + new Advertisement("시험기간 이벤트 참여하고 간식받자!", "공부하기도 힘든데 배는 고프지 말아야지! 시험기간 이벤트 참여하고 간식받자!", "https://www.google.com/imgres?imgurl=https%3A%2F%2Fcenter.shopping.naver.com%2Fimg%2Fimg_main_carousel.jpg&tbnid=4w-j7Xc4PzwJ5M&vet=12ahUKEwjw--fKvq7-AhV9klYBHQ8QAZYQMygAegUIARCIAQ..i&imgrefurl=https%3A%2F%2Fcenter.shopping.naver.com%2F&docid=oZ5oXq3Zhw_iFM&w=2050&h=1478&q=%EB%84%A4%EC%9D%B4%EB%B2%84%20%EC%87%BC%ED%95%91&ved=2ahUKEwjw--fKvq7-AhV9klYBHQ8QAZYQMygAegUIARCIAQ", "https://www.naver.com/") + ); + + public Advertisement getAd(){ + int randomIndex = new Random().nextInt(ads.size()); + return ads.get(randomIndex); + } +} diff --git a/ad/src/main/resources/application.yml b/ad/src/main/resources/application.yml new file mode 100644 index 0000000..afef73d --- /dev/null +++ b/ad/src/main/resources/application.yml @@ -0,0 +1,2 @@ +server: + port: 9090 \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4619d59..84d60e2 100644 --- a/build.gradle +++ b/build.gradle @@ -14,25 +14,30 @@ configurations { } } -repositories { - mavenCentral() +allprojects { + repositories { + mavenCentral() + } } -dependencies { - implementation 'org.springframework.boot:spring-boot-starter' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' //TODO: annotation build 활성화 언급하기 - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' - implementation 'org.springframework.boot:spring-boot-starter-validation:3.0.5' +subprojects { + apply plugin: 'java' + apply plugin: 'org.springframework.boot' + apply plugin: 'io.spring.dependency-management' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'com.h2database:h2' + group = 'com.cnu' + version = '0.0.1-SNAPSHOT' + sourceCompatibility = '17' - testImplementation 'org.springframework.boot:spring-boot-starter-test' -} + dependencies { + // lombok + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' //TODO: annotation build 활성화 언급하기 -tasks.named('test') { - useJUnitPlatform() -} + // test + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation('org.springframework.boot:spring-boot-starter-test') { + exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' + } + } +} \ No newline at end of file diff --git a/post/.gitignore b/post/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/post/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/post/build.gradle b/post/build.gradle new file mode 100644 index 0000000..7e08989 --- /dev/null +++ b/post/build.gradle @@ -0,0 +1,16 @@ +bootJar { + enabled = true +} +dependencies { + implementation 'org.springframework.boot:spring-boot-starter' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' + + // db + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'com.h2database:h2' + + // Resilience4j + implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.0.2' + implementation 'org.springframework.boot:spring-boot-starter-aop' +} \ No newline at end of file diff --git a/src/main/java/com/cnu/real_coding_server/RealCodingServerApplication.java b/post/src/main/java/com/cnu/post/RealCodingServerApplication.java similarity index 91% rename from src/main/java/com/cnu/real_coding_server/RealCodingServerApplication.java rename to post/src/main/java/com/cnu/post/RealCodingServerApplication.java index fc49dd5..a168c98 100644 --- a/src/main/java/com/cnu/real_coding_server/RealCodingServerApplication.java +++ b/post/src/main/java/com/cnu/post/RealCodingServerApplication.java @@ -1,4 +1,4 @@ -package com.cnu.real_coding_server; +package com.cnu.post; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/post/src/main/java/com/cnu/post/client/AdvertisementClient.java b/post/src/main/java/com/cnu/post/client/AdvertisementClient.java new file mode 100644 index 0000000..9105e61 --- /dev/null +++ b/post/src/main/java/com/cnu/post/client/AdvertisementClient.java @@ -0,0 +1,29 @@ +package com.cnu.post.client; + +import com.cnu.post.model.Advertisement; +import io.github.resilience4j.circuitbreaker.CallNotPermittedException; +import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +@Component +public class AdvertisementClient { + RestTemplate restTemplate = new RestTemplate(); + private static final Advertisement AD_FALLBACK = new Advertisement( + "Devblog로 개발 블로그를 만들어보자", + "Devblog는 개발자들을 위한 블로그 플랫폼입니다. Devblog로 개발 블로그를 만들어보세요!", + "https://devblog.com/images/og-image.png", + "https://devblog.com" + ); + @CircuitBreaker(name = "ad", fallbackMethod = "fallback") + public Advertisement getAd() { + return restTemplate.getForObject( + "http://localhost:9090/ads", + Advertisement.class + ); + } + + private Advertisement fallback(CallNotPermittedException e){ + return AD_FALLBACK; + } +} \ No newline at end of file diff --git a/src/main/java/com/cnu/real_coding_server/config/WebMVCConfig.java b/post/src/main/java/com/cnu/post/config/WebMVCConfig.java similarity index 92% rename from src/main/java/com/cnu/real_coding_server/config/WebMVCConfig.java rename to post/src/main/java/com/cnu/post/config/WebMVCConfig.java index 2348439..1f38c1e 100644 --- a/src/main/java/com/cnu/real_coding_server/config/WebMVCConfig.java +++ b/post/src/main/java/com/cnu/post/config/WebMVCConfig.java @@ -1,4 +1,4 @@ -package com.cnu.real_coding_server.config; +package com.cnu.post.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; diff --git a/src/main/java/com/cnu/real_coding_server/controller/PostController.java b/post/src/main/java/com/cnu/post/controller/PostController.java similarity index 86% rename from src/main/java/com/cnu/real_coding_server/controller/PostController.java rename to post/src/main/java/com/cnu/post/controller/PostController.java index c31c90e..6c9d380 100644 --- a/src/main/java/com/cnu/real_coding_server/controller/PostController.java +++ b/post/src/main/java/com/cnu/post/controller/PostController.java @@ -1,8 +1,9 @@ -package com.cnu.real_coding_server.controller; +package com.cnu.post.controller; -import com.cnu.real_coding_server.entity.Post; -import com.cnu.real_coding_server.model.request.PostRequest; -import com.cnu.real_coding_server.service.PostService; +import com.cnu.post.entity.Post; +import com.cnu.post.model.response.PostResponse; +import com.cnu.post.model.request.PostRequest; +import com.cnu.post.service.PostService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -43,3 +44,4 @@ public ResponseEntity deletePost(@PathVariable("postId") Integer postId) { return ResponseEntity.noContent().build(); } } + diff --git a/post/src/main/java/com/cnu/post/controller/ProjectController.java b/post/src/main/java/com/cnu/post/controller/ProjectController.java new file mode 100644 index 0000000..cb4a18b --- /dev/null +++ b/post/src/main/java/com/cnu/post/controller/ProjectController.java @@ -0,0 +1,46 @@ +package com.cnu.post.controller; + +import com.cnu.post.entity.Project; +import com.cnu.post.model.request.ProjectRequest; +import com.cnu.post.service.ProjectService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/projects") +@RequiredArgsConstructor +public class ProjectController { + private final ProjectService projectService; + + @PostMapping + public ResponseEntity createProject(@RequestBody ProjectRequest projectRequest) { + return ResponseEntity.ok(projectService.createProject(projectRequest)); + } + + @GetMapping + public ResponseEntity> getProjects() { + return ResponseEntity.ok(projectService.getProjects()); + } + + @GetMapping("/{projectId}") + public ResponseEntity getProject(@PathVariable("projectId") Integer projectId) { + return ResponseEntity.ok(projectService.getProject(projectId).orElse(null)); + } + + @PutMapping("/{projectId}") + public ResponseEntity updateProject(@PathVariable("projectId") Integer projectId, @RequestBody ProjectRequest projectRequest) { + return ResponseEntity.ok(projectService.updateProject(projectId, projectRequest).orElse(null)); + } + + @DeleteMapping("/{projectId}") + public ResponseEntity deleteProject(@PathVariable("projectId") Integer projectId) { + projectService.deleteProject(projectId); + + return ResponseEntity.noContent().build(); + } +} + +//1 \ No newline at end of file diff --git a/src/main/java/com/cnu/real_coding_server/entity/BaseEntity.java b/post/src/main/java/com/cnu/post/entity/BaseEntity.java similarity index 93% rename from src/main/java/com/cnu/real_coding_server/entity/BaseEntity.java rename to post/src/main/java/com/cnu/post/entity/BaseEntity.java index 2f967f0..db34549 100644 --- a/src/main/java/com/cnu/real_coding_server/entity/BaseEntity.java +++ b/post/src/main/java/com/cnu/post/entity/BaseEntity.java @@ -1,4 +1,4 @@ -package com.cnu.real_coding_server.entity; +package com.cnu.post.entity; import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; diff --git a/src/main/java/com/cnu/real_coding_server/entity/Post.java b/post/src/main/java/com/cnu/post/entity/Post.java similarity index 86% rename from src/main/java/com/cnu/real_coding_server/entity/Post.java rename to post/src/main/java/com/cnu/post/entity/Post.java index bb99748..d023c2a 100644 --- a/src/main/java/com/cnu/real_coding_server/entity/Post.java +++ b/post/src/main/java/com/cnu/post/entity/Post.java @@ -1,6 +1,6 @@ -package com.cnu.real_coding_server.entity; +package com.cnu.post.entity; -import com.cnu.real_coding_server.model.type.Tag; +import com.cnu.post.model.type.Tag; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/cnu/real_coding_server/entity/Project.java b/post/src/main/java/com/cnu/post/entity/Project.java similarity index 96% rename from src/main/java/com/cnu/real_coding_server/entity/Project.java rename to post/src/main/java/com/cnu/post/entity/Project.java index 07203b9..918cfb6 100644 --- a/src/main/java/com/cnu/real_coding_server/entity/Project.java +++ b/post/src/main/java/com/cnu/post/entity/Project.java @@ -1,4 +1,4 @@ -package com.cnu.real_coding_server.entity; +package com.cnu.post.entity; import jakarta.persistence.*; import lombok.*; diff --git a/post/src/main/java/com/cnu/post/model/Advertisement.java b/post/src/main/java/com/cnu/post/model/Advertisement.java new file mode 100644 index 0000000..544c9d8 --- /dev/null +++ b/post/src/main/java/com/cnu/post/model/Advertisement.java @@ -0,0 +1,9 @@ +package com.cnu.post.model; + +public record Advertisement( + String title, + String description, + String imageUrl, + String siteUrl +) { +} diff --git a/src/main/java/com/cnu/real_coding_server/model/request/PostRequest.java b/post/src/main/java/com/cnu/post/model/request/PostRequest.java similarity index 71% rename from src/main/java/com/cnu/real_coding_server/model/request/PostRequest.java rename to post/src/main/java/com/cnu/post/model/request/PostRequest.java index 5bd6733..67ce4b3 100644 --- a/src/main/java/com/cnu/real_coding_server/model/request/PostRequest.java +++ b/post/src/main/java/com/cnu/post/model/request/PostRequest.java @@ -1,8 +1,8 @@ -package com.cnu.real_coding_server.model.request; +package com.cnu.post.model.request; -import com.cnu.real_coding_server.entity.Post; -import com.cnu.real_coding_server.model.type.Tag; +import com.cnu.post.model.type.Tag; +import com.cnu.post.entity.Post; import jakarta.validation.Valid; import lombok.Getter; diff --git a/src/main/java/com/cnu/real_coding_server/model/request/ProjectRequest.java b/post/src/main/java/com/cnu/post/model/request/ProjectRequest.java similarity index 85% rename from src/main/java/com/cnu/real_coding_server/model/request/ProjectRequest.java rename to post/src/main/java/com/cnu/post/model/request/ProjectRequest.java index 2e80181..697ec4f 100644 --- a/src/main/java/com/cnu/real_coding_server/model/request/ProjectRequest.java +++ b/post/src/main/java/com/cnu/post/model/request/ProjectRequest.java @@ -1,6 +1,6 @@ -package com.cnu.real_coding_server.model.request; +package com.cnu.post.model.request; -import com.cnu.real_coding_server.entity.Project; +import com.cnu.post.entity.Project; import lombok.Getter; import java.time.LocalDateTime; diff --git a/post/src/main/java/com/cnu/post/model/response/PostResponse.java b/post/src/main/java/com/cnu/post/model/response/PostResponse.java new file mode 100644 index 0000000..c87f8c3 --- /dev/null +++ b/post/src/main/java/com/cnu/post/model/response/PostResponse.java @@ -0,0 +1,11 @@ +package com.cnu.post.model.response; + +import com.cnu.post.entity.Post; +import com.cnu.post.model.Advertisement; + +public record PostResponse( + Post post, + Advertisement advertisement + +) { +} diff --git a/src/main/java/com/cnu/real_coding_server/model/type/Tag.java b/post/src/main/java/com/cnu/post/model/type/Tag.java similarity index 58% rename from src/main/java/com/cnu/real_coding_server/model/type/Tag.java rename to post/src/main/java/com/cnu/post/model/type/Tag.java index e1f6d73..8d48a79 100644 --- a/src/main/java/com/cnu/real_coding_server/model/type/Tag.java +++ b/post/src/main/java/com/cnu/post/model/type/Tag.java @@ -1,4 +1,4 @@ -package com.cnu.real_coding_server.model.type; +package com.cnu.post.model.type; public enum Tag { JAVA, diff --git a/src/main/java/com/cnu/real_coding_server/repository/PostRepository.java b/post/src/main/java/com/cnu/post/repository/PostRepository.java similarity index 77% rename from src/main/java/com/cnu/real_coding_server/repository/PostRepository.java rename to post/src/main/java/com/cnu/post/repository/PostRepository.java index 0366c87..b95d0b6 100644 --- a/src/main/java/com/cnu/real_coding_server/repository/PostRepository.java +++ b/post/src/main/java/com/cnu/post/repository/PostRepository.java @@ -1,6 +1,6 @@ -package com.cnu.real_coding_server.repository; +package com.cnu.post.repository; -import com.cnu.real_coding_server.entity.Post; +import com.cnu.post.entity.Post; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/cnu/real_coding_server/repository/ProjectRepository.java b/post/src/main/java/com/cnu/post/repository/ProjectRepository.java similarity index 78% rename from src/main/java/com/cnu/real_coding_server/repository/ProjectRepository.java rename to post/src/main/java/com/cnu/post/repository/ProjectRepository.java index 2296df6..5be57a1 100644 --- a/src/main/java/com/cnu/real_coding_server/repository/ProjectRepository.java +++ b/post/src/main/java/com/cnu/post/repository/ProjectRepository.java @@ -1,6 +1,6 @@ -package com.cnu.real_coding_server.repository; +package com.cnu.post.repository; -import com.cnu.real_coding_server.entity.Project; +import com.cnu.post.entity.Project; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/cnu/real_coding_server/service/PostService.java b/post/src/main/java/com/cnu/post/service/PostService.java similarity index 84% rename from src/main/java/com/cnu/real_coding_server/service/PostService.java rename to post/src/main/java/com/cnu/post/service/PostService.java index 490a745..5644eb9 100644 --- a/src/main/java/com/cnu/real_coding_server/service/PostService.java +++ b/post/src/main/java/com/cnu/post/service/PostService.java @@ -1,8 +1,8 @@ -package com.cnu.real_coding_server.service; +package com.cnu.post.service; -import com.cnu.real_coding_server.entity.Post; -import com.cnu.real_coding_server.model.request.PostRequest; -import com.cnu.real_coding_server.repository.PostRepository; +import com.cnu.post.entity.Post; +import com.cnu.post.model.request.PostRequest; +import com.cnu.post.repository.PostRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/post/src/main/java/com/cnu/post/service/ProjectService.java b/post/src/main/java/com/cnu/post/service/ProjectService.java new file mode 100644 index 0000000..6c34742 --- /dev/null +++ b/post/src/main/java/com/cnu/post/service/ProjectService.java @@ -0,0 +1,48 @@ +package com.cnu.post.service; + +import com.cnu.post.entity.Project; +import com.cnu.post.model.request.ProjectRequest; +import com.cnu.post.repository.ProjectRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class ProjectService { + private final ProjectRepository projectRepository; + + public Project createProject(ProjectRequest projectRequest) { + return projectRepository.save(projectRequest.toEntity()); + } + + public List getProjects() { + return projectRepository.findAll(); + } + + public Optional getProject(Integer projectId) { + return projectRepository.findById(projectId); + } + + public Optional updateProject(Integer projectId, ProjectRequest projectRequest) { + return projectRepository.findById(projectId) + .map(project -> { + project.setTitle(projectRequest.getTitle()); + project.setDescription(projectRequest.getDescription()); + project.setSummary(projectRequest.getSummary()); + project.setStartDate(projectRequest.getStartDate()); + project.setEndDate(projectRequest.getEndDate()); + project.setIsInProgress(projectRequest.getIsInProgress()); + return projectRepository.save(project); + }); + } + + public void deleteProject(Integer projectId) { + projectRepository.findById(projectId) + .ifPresent(projectRepository::delete); + } +} + +//1 \ No newline at end of file diff --git a/post/src/main/resources/application.yml b/post/src/main/resources/application.yml new file mode 100644 index 0000000..05ee92a --- /dev/null +++ b/post/src/main/resources/application.yml @@ -0,0 +1,32 @@ +spring: + # H2 Setting Info (H2 Console? ???? ?? ???? ??) + h2: + console: + enabled: true # H2 Console? ???? ?? (H2 Console? H2 Database? UI? ????? ??) + path: /h2-console # H2 Console? Path + # Database Setting Info (Database? H2? ???? ?? H2?? ?? ??) + datasource: + driver-class-name: org.h2.Driver # Database? H2? ?????. + url: jdbc:h2:mem:devblog # H2 ?? ?? + username: sa # H2 ?? ? ??? username ?? (??? ??? ??) + password: # H2 ?? ? ??? password ?? (??? ??? ??) + + jpa: + hibernate: + ddl-auto: create # ??????? ??? ? ??????? ????? ?? ??? ?? + properties: + hibernate: + format_sql: true # ???? query? ??? + +resilience4j: + circuitbreaker: + instances: + ad: + slidingWindowType: COUNT_BASED + slidingWindowSize: 5 + failureRateThreshold: 50 # 에러 비율로 해당 값 이상으로 에러 발생시 서킷이 open + slowCallRateThreshold: 100 + minimumNumberOfCalls: 3 # circuitbreaker가 에러비율 또는 slow call 비율을 계산하기 전에 요구되는 최소 호출 횟수 + +logging.level: + org.hibernate.SQL: debug \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 85d9125..6fbe0b2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1 +1,3 @@ rootProject.name = "real_coding_server" +include("ad") +include("post")