Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions ad/.gitignore
Original file line number Diff line number Diff line change
@@ -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
8 changes: 8 additions & 0 deletions ad/build.gradle
Original file line number Diff line number Diff line change
@@ -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'
}
12 changes: 12 additions & 0 deletions ad/src/main/java/com/cnu/ad/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
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);
}
}
19 changes: 19 additions & 0 deletions ad/src/main/java/com/cnu/ad/controller/AdController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
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 AdController {
private final Adservice adservice;

@GetMapping
public Advertisement getAd() { return adservice.getAd(); }
}
9 changes: 9 additions & 0 deletions ad/src/main/java/com/cnu/ad/model/Advertisement.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.cnu.ad.model;

public record Advertisement (
String title,
String descrtiption,
String imageUrl,
String siteUrl
)
{}
24 changes: 24 additions & 0 deletions ad/src/main/java/com/cnu/ad/service/Adservice.java
Original file line number Diff line number Diff line change
@@ -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<Advertisement> 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);
}
}
2 changes: 2 additions & 0 deletions ad/src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
server:
port: 9090
39 changes: 22 additions & 17 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
}
}
}
42 changes: 42 additions & 0 deletions post/.gitignore
Original file line number Diff line number Diff line change
@@ -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
17 changes: 17 additions & 0 deletions post/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
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'

}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
28 changes: 28 additions & 0 deletions post/src/main/java/com/cnu/post/client/AdvertisementClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
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;
}
}
46 changes: 46 additions & 0 deletions post/src/main/java/com/cnu/post/controller/PostController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.cnu.post.controller;

import com.cnu.post.entity.Post;
import com.cnu.post.model.request.PostRequest;
import com.cnu.post.model.response.PostResponse;
import com.cnu.post.service.PostService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/posts")
@RequiredArgsConstructor
public class PostController {
private final PostService postService;

@PostMapping
public ResponseEntity<Post> createPost(@RequestBody PostRequest postRequest) {
return ResponseEntity.ok(postService.createPost(postRequest));
}

@GetMapping
public ResponseEntity<List<Post>> getPosts() {
return ResponseEntity.ok(postService.getPost());
}

@GetMapping("/{postId}")
public ResponseEntity<PostResponse> getPost(@PathVariable("postId") Integer postId){
return ResponseEntity.ok(postService.getPost(postId).orElse(null));
}

@PutMapping("/{postId}")
public ResponseEntity<Post> updatePost(@PathVariable("postId") Integer postId, @RequestBody PostRequest postRequest) {
return ResponseEntity.ok(postService.updatePost(postId, postRequest).orElse(null));
}

@DeleteMapping("/{postId}")
public ResponseEntity<Void> deletePost(@PathVariable("postId") Integer postId) {
postService.deletePost(postId);
return ResponseEntity.noContent().build();
}

}
49 changes: 49 additions & 0 deletions post/src/main/java/com/cnu/post/controller/ProjectController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.cnu.post.controller;

import com.cnu.post.entity.Project;
import com.cnu.post.model.request.PostRequest;
import com.cnu.post.model.request.ProjectRequest;
import com.cnu.post.model.response.PostResponse;
import com.cnu.post.model.response.ProjectResponse;
import com.cnu.post.service.PostService;
import com.cnu.post.service.ProjectService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.RequestEntity;
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<Project> createProject(@RequestBody ProjectRequest projectRequest) {
return ResponseEntity.ok(projectService.createProject(projectRequest));
}

@GetMapping
public ResponseEntity<List<Project>> getProjects() {
return ResponseEntity.ok(projectService.getProject());
}

@GetMapping("/{projectId}")
public ResponseEntity<Project> getProject(@PathVariable("projectId") Integer projectId){
return ResponseEntity.ok(projectService.getProject(projectId).orElse(null));
}

@PutMapping("/{projectId}")
public ResponseEntity<Project> updateProject(@PathVariable("projectId") Integer projectId, @RequestBody ProjectRequest projectRequest) {
return ResponseEntity.ok(projectService.updateProject(projectId, projectRequest).orElse(null));
}

@DeleteMapping("/{projectId}")
public ResponseEntity<Void> deleteProject(@PathVariable("projectId") Integer projectId) {
projectService.deleteProject(projectId);
return ResponseEntity.noContent().build();
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.cnu.real_coding_server.entity;
package com.cnu.post.entity;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
Expand Down
Original file line number Diff line number Diff line change
@@ -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.*;

Expand All @@ -20,6 +20,7 @@ public class Post extends BaseEntity {
@Setter
private String contents;

@Setter
@Enumerated(EnumType.STRING)
private Tag tag;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.cnu.real_coding_server.entity;
package com.cnu.post.entity;

import jakarta.persistence.*;
import lombok.*;
Expand Down
Loading