From 6dcbebe24d35fb3e0629231a049158df37a03926 Mon Sep 17 00:00:00 2001 From: forge-bot Date: Tue, 14 Jul 2026 06:26:16 +0000 Subject: [PATCH 1/9] forge: open work branch for role-developer-live-1522-001-attempt-1-run-6a48084c658b --- .../role-developer-live-1522-001-attempt-1-run-6a48084c658b.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .forge/role-developer-live-1522-001-attempt-1-run-6a48084c658b.md diff --git a/.forge/role-developer-live-1522-001-attempt-1-run-6a48084c658b.md b/.forge/role-developer-live-1522-001-attempt-1-run-6a48084c658b.md new file mode 100644 index 0000000..ae2040e --- /dev/null +++ b/.forge/role-developer-live-1522-001-attempt-1-run-6a48084c658b.md @@ -0,0 +1,3 @@ +# role-developer-live-1522-001-attempt-1-run-6a48084c658b + +Forge 이슈 작업 브랜치 `forge/role-developer-live-1522-001-attempt-1-run-6a48084c658b`. From 1aec3573e6e8639faf6b39e5f13664e0085da966 Mon Sep 17 00:00:00 2001 From: forge-bot Date: Tue, 14 Jul 2026 06:26:31 +0000 Subject: [PATCH 2/9] =?UTF-8?q?Developer=20=EC=97=AD=ED=95=A0=20Spring=20?= =?UTF-8?q?=EA=B3=A8=EA=B2=A9=20smoke=20(role-developer-live-1522-001)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a9c2722 --- /dev/null +++ b/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.5 + + + com.example + demo + 0.0.1-SNAPSHOT + demo + Developer Role Spring Skeleton Application + + 17 + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file From 7b68f7787f0050c780e6c2c83ff615f38956ce91 Mon Sep 17 00:00:00 2001 From: forge-bot Date: Tue, 14 Jul 2026 06:26:31 +0000 Subject: [PATCH 3/9] =?UTF-8?q?Developer=20=EC=97=AD=ED=95=A0=20Spring=20?= =?UTF-8?q?=EA=B3=A8=EA=B2=A9=20smoke=20(role-developer-live-1522-001)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/demo/DemoApplication.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/com/example/demo/DemoApplication.java diff --git a/src/main/java/com/example/demo/DemoApplication.java b/src/main/java/com/example/demo/DemoApplication.java new file mode 100644 index 0000000..2a9bdbe --- /dev/null +++ b/src/main/java/com/example/demo/DemoApplication.java @@ -0,0 +1,12 @@ +package com.example.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } +} From 310e6d2433fe3d8f7cd1a9171dc2389e15f68abb Mon Sep 17 00:00:00 2001 From: forge-bot Date: Tue, 14 Jul 2026 06:26:32 +0000 Subject: [PATCH 4/9] =?UTF-8?q?Developer=20=EC=97=AD=ED=95=A0=20Spring=20?= =?UTF-8?q?=EA=B3=A8=EA=B2=A9=20smoke=20(role-developer-live-1522-001)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/HelloController.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/com/example/demo/controller/HelloController.java diff --git a/src/main/java/com/example/demo/controller/HelloController.java b/src/main/java/com/example/demo/controller/HelloController.java new file mode 100644 index 0000000..54f430c --- /dev/null +++ b/src/main/java/com/example/demo/controller/HelloController.java @@ -0,0 +1,29 @@ +package com.example.demo.controller; + +import com.example.demo.service.HelloService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/hello") +public class HelloController { + + private final HelloService helloService; + + public HelloController(HelloService helloService) { + this.helloService = helloService; + } + + @GetMapping + public ResponseEntity greet() { + return ResponseEntity.ok(helloService.getGreeting()); + } + + @GetMapping("/{name}") + public ResponseEntity greetWithName(@PathVariable String name) { + return ResponseEntity.ok(helloService.getGreetingFor(name)); + } +} From 6040d126ddccbc61d0dfc941ac803868df98765f Mon Sep 17 00:00:00 2001 From: forge-bot Date: Tue, 14 Jul 2026 06:26:34 +0000 Subject: [PATCH 5/9] =?UTF-8?q?Developer=20=EC=97=AD=ED=95=A0=20Spring=20?= =?UTF-8?q?=EA=B3=A8=EA=B2=A9=20smoke=20(role-developer-live-1522-001)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/service/HelloService.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/com/example/demo/service/HelloService.java diff --git a/src/main/java/com/example/demo/service/HelloService.java b/src/main/java/com/example/demo/service/HelloService.java new file mode 100644 index 0000000..f2dfb2d --- /dev/null +++ b/src/main/java/com/example/demo/service/HelloService.java @@ -0,0 +1,21 @@ +package com.example.demo.service; + +import org.springframework.stereotype.Service; + +@Service +public class HelloService { + + private static final String GREETING_TEMPLATE = "Hello, %s!"; + private static final String DEFAULT_GREETING = "Hello, World!"; + + public String getGreeting() { + return DEFAULT_GREETING; + } + + public String getGreetingFor(String name) { + if (name == null || name.isBlank()) { + return DEFAULT_GREETING; + } + return String.format(GREETING_TEMPLATE, name); + } +} From f4c99e67d715eded0f4d18e17e9a4e0456f55e5e Mon Sep 17 00:00:00 2001 From: forge-bot Date: Tue, 14 Jul 2026 06:26:35 +0000 Subject: [PATCH 6/9] =?UTF-8?q?Developer=20=EC=97=AD=ED=95=A0=20Spring=20?= =?UTF-8?q?=EA=B3=A8=EA=B2=A9=20smoke=20(role-developer-live-1522-001)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/main/resources/application.properties diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..4e0b68a --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.application.name=demo +server.port=8080 From 2453d71f0fc0f61735320d2bbbf467e56d0c6812 Mon Sep 17 00:00:00 2001 From: forge-bot Date: Tue, 14 Jul 2026 06:26:36 +0000 Subject: [PATCH 7/9] =?UTF-8?q?Developer=20=EC=97=AD=ED=95=A0=20Spring=20?= =?UTF-8?q?=EA=B3=A8=EA=B2=A9=20smoke=20(role-developer-live-1522-001)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/DemoApplicationTests.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/test/java/com/example/demo/DemoApplicationTests.java diff --git a/src/test/java/com/example/demo/DemoApplicationTests.java b/src/test/java/com/example/demo/DemoApplicationTests.java new file mode 100644 index 0000000..f37ed66 --- /dev/null +++ b/src/test/java/com/example/demo/DemoApplicationTests.java @@ -0,0 +1,15 @@ +package com.example.demo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@TestPropertySource(properties = {"spring.main.allow-bean-definition-overriding=true"}) +class DemoApplicationTests { + + @Test + void contextLoads() { + // Smoke test: verify Spring context loads successfully + } +} From 486a29a9c3c755703595f1aef18fb72de0075a8d Mon Sep 17 00:00:00 2001 From: forge-bot Date: Tue, 14 Jul 2026 06:26:37 +0000 Subject: [PATCH 8/9] =?UTF-8?q?Developer=20=EC=97=AD=ED=95=A0=20Spring=20?= =?UTF-8?q?=EA=B3=A8=EA=B2=A9=20smoke=20(role-developer-live-1522-001)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/service/HelloServiceTest.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/test/java/com/example/demo/service/HelloServiceTest.java diff --git a/src/test/java/com/example/demo/service/HelloServiceTest.java b/src/test/java/com/example/demo/service/HelloServiceTest.java new file mode 100644 index 0000000..55d748d --- /dev/null +++ b/src/test/java/com/example/demo/service/HelloServiceTest.java @@ -0,0 +1,55 @@ +package com.example.demo.service; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@DisplayName("HelloService Unit Tests") +class HelloServiceTest { + + private HelloService helloService; + + @BeforeEach + void setUp() { + helloService = new HelloService(); + } + + @Test + @DisplayName("getGreeting returns default greeting") + void getGreeting_ReturnsDefaultGreeting() { + String result = helloService.getGreeting(); + + assertNotNull(result); + assertEquals("Hello, World!", result); + } + + @Test + @DisplayName("getGreetingFor returns personalized greeting") + void getGreetingFor_ReturnsPersonalizedGreeting() { + String result = helloService.getGreetingFor("Developer"); + + assertNotNull(result); + assertEquals("Hello, Developer!", result); + } + + @Test + @DisplayName("getGreetingFor with null returns default greeting") + void getGreetingFor_WithNull_ReturnsDefaultGreeting() { + String result = helloService.getGreetingFor(null); + + assertNotNull(result); + assertEquals("Hello, World!", result); + } + + @Test + @DisplayName("getGreetingFor with blank string returns default greeting") + void getGreetingFor_WithBlankString_ReturnsDefaultGreeting() { + String result = helloService.getGreetingFor(" "); + + assertNotNull(result); + assertEquals("Hello, World!", result); + } +} From f381707f1c0187ae4284dd337d36e0b1fc841aa8 Mon Sep 17 00:00:00 2001 From: forge-bot Date: Tue, 14 Jul 2026 06:26:38 +0000 Subject: [PATCH 9/9] =?UTF-8?q?Developer=20=EC=97=AD=ED=95=A0=20Spring=20?= =?UTF-8?q?=EA=B3=A8=EA=B2=A9=20smoke=20(role-developer-live-1522-001)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/HelloControllerTest.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/test/java/com/example/demo/controller/HelloControllerTest.java diff --git a/src/test/java/com/example/demo/controller/HelloControllerTest.java b/src/test/java/com/example/demo/controller/HelloControllerTest.java new file mode 100644 index 0000000..85559c4 --- /dev/null +++ b/src/test/java/com/example/demo/controller/HelloControllerTest.java @@ -0,0 +1,48 @@ +package com.example.demo.controller; + +import com.example.demo.service.HelloService; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(HelloController.class) +@DisplayName("HelloController Unit Tests") +class HelloControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private HelloService helloService; + + @Test + @DisplayName("GET /api/hello returns default greeting") + void greet_ReturnsDefaultGreeting() throws Exception { + when(helloService.getGreeting()).thenReturn("Hello, World!"); + + mockMvc.perform(get("/api/hello") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("Hello, World!")); + } + + @Test + @DisplayName("GET /api/hello/{name} returns personalized greeting") + void greetWithName_ReturnsPersonalizedGreeting() throws Exception { + when(helloService.getGreetingFor("Developer")).thenReturn("Hello, Developer!"); + + mockMvc.perform(get("/api/hello/Developer") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("Hello, Developer!")); + } +}