From 38c416e6223c95a5bc68a8d231b64e166494a5d8 Mon Sep 17 00:00:00 2001 From: yukeun Date: Sun, 9 Feb 2020 15:15:03 +0900 Subject: [PATCH 1/8] modify: step0 mission test code modify --- .../java/atdd/station/StationController.java | 8 +++++++ .../atdd/station/StationAcceptanceTest.java | 22 ++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/atdd/station/StationController.java b/src/main/java/atdd/station/StationController.java index 9e5ed72eaf..fbc04c67d6 100644 --- a/src/main/java/atdd/station/StationController.java +++ b/src/main/java/atdd/station/StationController.java @@ -1,8 +1,16 @@ package atdd.station; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; +import java.net.URI; + @RestController public class StationController { + @PostMapping("/stations") + public ResponseEntity createStation() { + return ResponseEntity.created(URI.create("/station/1")).build(); + } } diff --git a/src/test/java/atdd/station/StationAcceptanceTest.java b/src/test/java/atdd/station/StationAcceptanceTest.java index 83ae3af073..514f0a48d8 100644 --- a/src/test/java/atdd/station/StationAcceptanceTest.java +++ b/src/test/java/atdd/station/StationAcceptanceTest.java @@ -1,7 +1,15 @@ package atdd.station; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.web.reactive.server.WebTestClient; +import reactor.core.publisher.Mono; @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @@ -13,17 +21,19 @@ public class StationAcceptanceTest { private WebTestClient webTestClient; @Test - public void test(){ + public void createStation() { + //given String stationName = "강남역"; String inputJson = "{\"name\":\""+stationName+"\"}"; - webTestClient.post().uri("/stations") + //when + webTestClient.post().uri("stations") .contentType(MediaType.APPLICATION_JSON) .body(Mono.just(inputJson), String.class) .exchange() - .expectStatus().isCreated() - .expectHeader().contentType(MediaType.APPLICATION_JSON) - .expectHeader().exists("Location") - .expectBody().jsonPath("$.name").isEqualTo(stationName); + .expectStatus().isCreated(); +// .expectHeader().contentType(MediaType.APPLICATION_JSON) +// .expectHeader().exists("Location") +// .expectBody().jsonPath("$.name").isEqualTo(stationName); } } From 1f12382f7ef748274f8fdc961d5de83dbd28a984 Mon Sep 17 00:00:00 2001 From: yukeun Date: Sun, 9 Feb 2020 22:56:16 +0900 Subject: [PATCH 2/8] =?UTF-8?q?Add:=20lombok,=20jpa=20dependencies=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 +++++ src/main/java/atdd/station/Service/StationService.java | 4 ++++ .../atdd/station/{ => controller}/StationController.java | 0 src/main/java/atdd/station/domain/Station.java | 4 ++++ src/main/java/atdd/station/domain/dto/StationDto.java | 4 ++++ src/main/java/atdd/station/repository/StationRepository.java | 4 ++++ .../atdd/station/{ => controller}/StationAcceptanceTest.java | 0 7 files changed, 21 insertions(+) create mode 100644 src/main/java/atdd/station/Service/StationService.java rename src/main/java/atdd/station/{ => controller}/StationController.java (100%) create mode 100644 src/main/java/atdd/station/domain/Station.java create mode 100644 src/main/java/atdd/station/domain/dto/StationDto.java create mode 100644 src/main/java/atdd/station/repository/StationRepository.java rename src/test/java/atdd/station/{ => controller}/StationAcceptanceTest.java (100%) diff --git a/build.gradle b/build.gradle index c4934956fa..fbebb12c1c 100644 --- a/build.gradle +++ b/build.gradle @@ -19,11 +19,16 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.jgrapht:jgrapht-core:1.0.1' implementation 'net.rakugakibox.spring.boot:logback-access-spring-boot-starter:2.7.1' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.h2database:h2' testImplementation 'org.springframework.boot:spring-boot-starter-webflux' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } + compileOnly("org.projectlombok:lombok") + testCompileOnly("org.projectlombok:lombok") + annotationProcessor("org.projectlombok:lombok") + testAnnotationProcessor("org.projectlombok:lombok") } test { diff --git a/src/main/java/atdd/station/Service/StationService.java b/src/main/java/atdd/station/Service/StationService.java new file mode 100644 index 0000000000..374f0a0879 --- /dev/null +++ b/src/main/java/atdd/station/Service/StationService.java @@ -0,0 +1,4 @@ +package atdd.station.Service; + +public class StationService { +} diff --git a/src/main/java/atdd/station/StationController.java b/src/main/java/atdd/station/controller/StationController.java similarity index 100% rename from src/main/java/atdd/station/StationController.java rename to src/main/java/atdd/station/controller/StationController.java diff --git a/src/main/java/atdd/station/domain/Station.java b/src/main/java/atdd/station/domain/Station.java new file mode 100644 index 0000000000..66c1022a0f --- /dev/null +++ b/src/main/java/atdd/station/domain/Station.java @@ -0,0 +1,4 @@ +package atdd.station.domain; + +public class Station { +} diff --git a/src/main/java/atdd/station/domain/dto/StationDto.java b/src/main/java/atdd/station/domain/dto/StationDto.java new file mode 100644 index 0000000000..edd2ba9390 --- /dev/null +++ b/src/main/java/atdd/station/domain/dto/StationDto.java @@ -0,0 +1,4 @@ +package atdd.station.domain.dto; + +public class StationDto { +} diff --git a/src/main/java/atdd/station/repository/StationRepository.java b/src/main/java/atdd/station/repository/StationRepository.java new file mode 100644 index 0000000000..e8808bc4db --- /dev/null +++ b/src/main/java/atdd/station/repository/StationRepository.java @@ -0,0 +1,4 @@ +package atdd.station.repository; + +public interface StationRepository { +} diff --git a/src/test/java/atdd/station/StationAcceptanceTest.java b/src/test/java/atdd/station/controller/StationAcceptanceTest.java similarity index 100% rename from src/test/java/atdd/station/StationAcceptanceTest.java rename to src/test/java/atdd/station/controller/StationAcceptanceTest.java From 7ca8e2cac87af210ac31deaf8932303084700f10 Mon Sep 17 00:00:00 2001 From: yukeun Date: Sun, 9 Feb 2020 23:00:49 +0900 Subject: [PATCH 3/8] =?UTF-8?q?Update:=20Controller=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C,=20=EC=A1=B0=ED=9A=8C,=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../station/controller/StationController.java | 65 ++++++++++++++++--- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/src/main/java/atdd/station/controller/StationController.java b/src/main/java/atdd/station/controller/StationController.java index fbc04c67d6..1f47c6ea51 100644 --- a/src/main/java/atdd/station/controller/StationController.java +++ b/src/main/java/atdd/station/controller/StationController.java @@ -1,16 +1,65 @@ -package atdd.station; +package atdd.station.controller; +import atdd.station.Service.StationService; +import atdd.station.domain.Station; +import atdd.station.domain.dto.StationDto; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.net.URI; +import java.util.List; +import java.util.Optional; +/* + step1 : 지하철역 관리 API 만들기 + */ @RestController -public class StationController { - - @PostMapping("/stations") - public ResponseEntity createStation() { - return ResponseEntity.created(URI.create("/station/1")).build(); +@RequestMapping(value = "/stations", produces = "application/json") +public class StationController +{ + @Resource(name = "stationService") + private StationService stationService; + /* + 1. 지하철역 등록 + */ + @PostMapping("/create") + public ResponseEntity createStations(@RequestBody StationDto stationDto) + { + Station createdStation = stationService.create(stationDto); + HttpHeaders headers = new HttpHeaders(); + headers.setLocation(URI.create("/stations/list" + createdStation.getId())); + ResponseEntity returnEntity = new ResponseEntity<>(createdStation, headers, HttpStatus.CREATED); + return returnEntity; + } + /* + 2. 지하철역 목록 조회 + */ + @GetMapping("/list") + public ResponseEntity list() + { + List stationList = stationService.list(); + ResponseEntity returnEntity = new ResponseEntity(stationList, HttpStatus.OK); + return returnEntity; + } + /* + 3. 지하철역 조회 + */ + @GetMapping("/detail/{id}") + public ResponseEntity detailById(@PathVariable long id) + { + Optional detailStation = stationService.findById(id); + ResponseEntity returnEntity = new ResponseEntity(detailStation, HttpStatus.OK); + return returnEntity; + } + /* + 4. 지하철역 삭제 + */ + @DeleteMapping("/delete/{id}") + public void deleteStation(@PathVariable long id) + { + stationService.deleteStationById(id); } } From 24830d19ed663909b3fd4b96dd00828501d06b8a Mon Sep 17 00:00:00 2001 From: yukeun Date: Sun, 9 Feb 2020 23:01:29 +0900 Subject: [PATCH 4/8] =?UTF-8?q?Add:=20Service=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../atdd/station/Service/StationService.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/atdd/station/Service/StationService.java b/src/main/java/atdd/station/Service/StationService.java index 374f0a0879..267d71504b 100644 --- a/src/main/java/atdd/station/Service/StationService.java +++ b/src/main/java/atdd/station/Service/StationService.java @@ -1,4 +1,38 @@ package atdd.station.Service; -public class StationService { +import atdd.station.domain.Station; +import atdd.station.domain.dto.StationDto; +import atdd.station.repository.StationRepository; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Optional; + +@Service("stationService") +public class StationService +{ + @Resource(name = "stationRepository") + private StationRepository stationRepository; + + public Station create(StationDto stationDto) + { + return stationRepository.save(stationDto.toEntity()); + } + + public List list() + { + List returnList = stationRepository.findAll(); + return returnList; + } + + public Optional findById(long id) + { + return stationRepository.findById(id); + } + + public void deleteStationById(long id) + { + stationRepository.deleteById(id); + } } From 5836bedd05f2e55002ca1b17c170aeb8a22f47e4 Mon Sep 17 00:00:00 2001 From: yukeun Date: Sun, 9 Feb 2020 23:02:24 +0900 Subject: [PATCH 5/8] =?UTF-8?q?Add:=20Dto,=20Entity=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/atdd/station/domain/Station.java | 23 ++++++++++++++++++- .../atdd/station/domain/dto/StationDto.java | 17 +++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/main/java/atdd/station/domain/Station.java b/src/main/java/atdd/station/domain/Station.java index 66c1022a0f..71cc06e468 100644 --- a/src/main/java/atdd/station/domain/Station.java +++ b/src/main/java/atdd/station/domain/Station.java @@ -1,4 +1,25 @@ package atdd.station.domain; -public class Station { +import lombok.*; + +import javax.persistence.*; + +@NoArgsConstructor +@Getter +@Entity +public class Station +{ + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + @Column(length = 20, nullable = false) + private String name; + + @Builder + public Station(String name) + { + this.name = name; + } + } diff --git a/src/main/java/atdd/station/domain/dto/StationDto.java b/src/main/java/atdd/station/domain/dto/StationDto.java index edd2ba9390..65b76951e0 100644 --- a/src/main/java/atdd/station/domain/dto/StationDto.java +++ b/src/main/java/atdd/station/domain/dto/StationDto.java @@ -1,4 +1,19 @@ package atdd.station.domain.dto; -public class StationDto { +import atdd.station.domain.Station; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class StationDto +{ + private String name; + + public Station toEntity() + { + return Station.builder().name(name).build(); + } } From 781e1ceafb0573f0dcf9ca9b39d9ca614b5bf2e9 Mon Sep 17 00:00:00 2001 From: yukeun Date: Sun, 9 Feb 2020 23:03:01 +0900 Subject: [PATCH 6/8] =?UTF-8?q?Add:=20Repository=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/atdd/station/repository/StationRepository.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/atdd/station/repository/StationRepository.java b/src/main/java/atdd/station/repository/StationRepository.java index e8808bc4db..0655653ea6 100644 --- a/src/main/java/atdd/station/repository/StationRepository.java +++ b/src/main/java/atdd/station/repository/StationRepository.java @@ -1,4 +1,8 @@ package atdd.station.repository; -public interface StationRepository { -} +import atdd.station.domain.Station; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface StationRepository extends JpaRepository {} From 5755f3f897d125861fcdc75429cd27f9cb69d6a9 Mon Sep 17 00:00:00 2001 From: yukeun Date: Sun, 9 Feb 2020 23:04:39 +0900 Subject: [PATCH 7/8] =?UTF-8?q?Add:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StationAcceptanceTest.java | 77 ++++++++++++++++--- 1 file changed, 65 insertions(+), 12 deletions(-) diff --git a/src/test/java/atdd/station/controller/StationAcceptanceTest.java b/src/test/java/atdd/station/controller/StationAcceptanceTest.java index 514f0a48d8..6328298337 100644 --- a/src/test/java/atdd/station/controller/StationAcceptanceTest.java +++ b/src/test/java/atdd/station/controller/StationAcceptanceTest.java @@ -1,4 +1,4 @@ -package atdd.station; +package atdd.station.controller; import org.junit.jupiter.api.Test; import org.slf4j.Logger; @@ -14,26 +14,79 @@ @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @AutoConfigureWebTestClient -public class StationAcceptanceTest { +public class StationAcceptanceTest +{ private static final Logger logger = LoggerFactory.getLogger(StationAcceptanceTest.class); + private final String STATIOIN_NAME = "강남역"; + private final String BASE_URL = "/stations"; + private final int TEST_ID = 1; + @Autowired private WebTestClient webTestClient; @Test - public void createStation() { - //given - String stationName = "강남역"; - String inputJson = "{\"name\":\""+stationName+"\"}"; + public void createStation() + { + String inputJson = "{\"name\":\""+ this.STATIOIN_NAME +"\"}"; + + webTestClient.post().uri(BASE_URL + "/create") + .contentType(MediaType.APPLICATION_JSON) + .body(Mono.just(inputJson), String.class) + .exchange() + .expectStatus().isCreated() + .expectHeader().contentType(MediaType.APPLICATION_JSON) + .expectHeader().exists("Location") + .expectBody().jsonPath("$.name").isEqualTo(this.STATIOIN_NAME); + } + + @Test + public void list() + { + testCreateStation(STATIOIN_NAME); + + webTestClient.get().uri(BASE_URL + "/list") + .exchange() + .expectStatus().isOk() + .expectHeader().contentType(MediaType.APPLICATION_JSON) + .expectBody().jsonPath("$.[0].name").isEqualTo(STATIOIN_NAME); + } + + @Test + public void detailById() + { + testCreateStation(STATIOIN_NAME); + + webTestClient.get().uri(BASE_URL + "/detail/" + TEST_ID) + .exchange() + .expectStatus().isOk() + .expectHeader().contentType(MediaType.APPLICATION_JSON) + .expectBody().jsonPath("$.name").isEqualTo(STATIOIN_NAME); + + } + + @Test + public void deleteStation() + { + testCreateStation(STATIOIN_NAME); + + webTestClient.delete().uri(BASE_URL + "/delete/" + TEST_ID) + .exchange() + .expectStatus().isOk(); + } + + + public void testCreateStation(String stationName) + { + String inputJson = "{\"name\":\""+ this.STATIOIN_NAME +"\"}"; - //when - webTestClient.post().uri("stations") + webTestClient.post().uri(BASE_URL + "/create") .contentType(MediaType.APPLICATION_JSON) .body(Mono.just(inputJson), String.class) .exchange() - .expectStatus().isCreated(); -// .expectHeader().contentType(MediaType.APPLICATION_JSON) -// .expectHeader().exists("Location") -// .expectBody().jsonPath("$.name").isEqualTo(stationName); + .expectStatus().isCreated() + .expectHeader().contentType(MediaType.APPLICATION_JSON) + .expectHeader().exists("Location") + .expectBody().jsonPath("$.name").isEqualTo(stationName); } } From 3d987427589c36b7a3f4787a3d85a8a8530dde80 Mon Sep 17 00:00:00 2001 From: yukeun Date: Sun, 9 Feb 2020 23:06:00 +0900 Subject: [PATCH 8/8] =?UTF-8?q?Update:=20h2=20=ED=99=9C=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b64e2be278..126b98408e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,4 +1,7 @@ spring: + h2: + console: + enabled: true datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:testdb