Skip to content

Commit 22a5836

Browse files
committed
modify webflux 2.0.0.M1 & refactoring code
1 parent 2437e26 commit 22a5836

File tree

7 files changed

+129
-22
lines changed

7 files changed

+129
-22
lines changed

SpringBootWebFlux/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
buildscript {
22
ext {
3-
springBootVersion = '2.0.0.BUILD-SNAPSHOT'
3+
springBootVersion = '2.0.0.M1'
44
}
55
repositories {
66
mavenCentral()
Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.tistory.heowc;
22

3-
import com.tistory.heowc.domain.Message;
4-
import com.tistory.heowc.repository.MessageRepository;
3+
import com.tistory.heowc.service.MessageService;
54
import org.springframework.beans.factory.annotation.Autowired;
65
import org.springframework.boot.CommandLineRunner;
76
import org.springframework.boot.SpringApplication;
@@ -11,21 +10,16 @@
1110
@SpringBootApplication
1211
public class SpringBootWebFluxApplication {
1312

14-
@Autowired MessageRepository messageRepository;
13+
@Autowired MessageService messageService;
1514

1615
public static void main(String[] args) {
1716
SpringApplication.run(SpringBootWebFluxApplication.class, args);
1817
}
1918

20-
// @Bean
21-
// public WebClient webClient() {
22-
// return WebClient.create("http://localhost:8080/");
23-
// }
24-
//
2519
@Bean
2620
public CommandLineRunner commandLineRunner() {
2721
return args -> {
28-
messageRepository.save(new Message("hi"));
22+
messageService.insert("hi");
2923
};
3024
}
3125
}

SpringBootWebFlux/src/main/java/com/tistory/heowc/repository/MessageRepository.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,9 @@
22

33
import com.tistory.heowc.domain.Message;
44
import org.springframework.data.jpa.repository.JpaRepository;
5-
import org.springframework.scheduling.annotation.Async;
65
import org.springframework.stereotype.Repository;
76

8-
import java.util.concurrent.CompletableFuture;
9-
10-
@Async
117
@Repository
128
public interface MessageRepository extends JpaRepository<Message, Long> {
139

14-
CompletableFuture<Message> findByIdx(Long idx);
1510
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.tistory.heowc.service;
2+
3+
import com.tistory.heowc.domain.Message;
4+
5+
import java.util.concurrent.CompletableFuture;
6+
7+
public interface MessageService {
8+
9+
CompletableFuture<Message> findByOne(Long idx);
10+
CompletableFuture<Message> insert(String content);
11+
CompletableFuture<Message> update(final Message message);
12+
void delete(Long idx);
13+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.tistory.heowc.service;
2+
3+
4+
import com.tistory.heowc.domain.Message;
5+
import com.tistory.heowc.repository.MessageRepository;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.scheduling.annotation.Async;
8+
import org.springframework.stereotype.Service;
9+
import org.springframework.transaction.annotation.Transactional;
10+
11+
import java.util.concurrent.CompletableFuture;
12+
13+
@Service
14+
@Transactional
15+
@Async
16+
public class MessageServiceImpl implements MessageService {
17+
18+
@Autowired MessageRepository messageRepository;
19+
20+
@Override
21+
public CompletableFuture<Message> findByOne(Long idx) {
22+
return CompletableFuture.completedFuture(messageRepository.findById(idx).get());
23+
}
24+
25+
@Override
26+
public CompletableFuture<Message> insert(String content) {
27+
return CompletableFuture.completedFuture(messageRepository.save(new Message(content)));
28+
}
29+
30+
@Override
31+
public CompletableFuture<Message> update(final Message message) {
32+
return CompletableFuture.completedFuture(messageRepository.findById(message.getIdx()).get())
33+
.thenApply(msg -> {
34+
msg.setContent(message.getContent());
35+
return msg;
36+
});
37+
}
38+
39+
@Override
40+
public void delete(Long idx) {
41+
messageRepository.deleteById(idx);
42+
}
43+
}
Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.tistory.heowc.web;
22

33
import com.tistory.heowc.domain.Message;
4-
import com.tistory.heowc.repository.MessageRepository;
4+
import com.tistory.heowc.service.MessageService;
55
import org.springframework.beans.factory.annotation.Autowired;
66
import org.springframework.web.bind.annotation.*;
77
import reactor.core.publisher.Mono;
@@ -10,20 +10,25 @@
1010
@RequestMapping("message")
1111
public class MessageController {
1212

13-
@Autowired MessageRepository messageRepository;
13+
@Autowired MessageService messageService;
1414

1515
@GetMapping("{idx}")
16-
public Mono<Message> findBy(@PathVariable Long idx) {
17-
return Mono.fromCompletionStage(messageRepository.findByIdx(idx));
16+
public Mono<Message> findByOne(@PathVariable Long idx) {
17+
return Mono.fromCompletionStage(messageService.findByOne(idx));
1818
}
1919

2020
@PostMapping
21-
public void create(@RequestBody Mono<Message> message) {
22-
message.subscribe(entity -> messageRepository.save(entity));
21+
public Mono<Message> insert(@RequestBody Mono<Message> message) {
22+
return Mono.fromCompletionStage(messageService.insert(message.block().getContent()));
23+
}
24+
25+
@PutMapping
26+
public Mono<Message> update(@RequestBody Mono<Message> message) {
27+
return Mono.fromCompletionStage(messageService.update(message.block()));
2328
}
2429

2530
@DeleteMapping("{idx}")
2631
public void deleteByIdx(@PathVariable Long idx) {
27-
messageRepository.deleteById(idx);
32+
messageService.delete(idx);
2833
}
2934
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.tistory.heowc.web;
2+
3+
import org.junit.Before;
4+
import org.junit.Test;
5+
import org.junit.runner.RunWith;
6+
import org.springframework.boot.test.context.SpringBootTest;
7+
import org.springframework.http.MediaType;
8+
import org.springframework.test.context.junit4.SpringRunner;
9+
import org.springframework.test.web.reactive.server.WebTestClient;
10+
11+
@RunWith(SpringRunner.class)
12+
@SpringBootTest
13+
public class MessageControllerTest {
14+
15+
private WebTestClient webClient;
16+
17+
@Before
18+
public void before_init() throws Exception {
19+
webClient = WebTestClient.bindToServer().baseUrl("http://localhost:8080/").build();
20+
}
21+
22+
@Test
23+
public void test_findByOne() throws Exception {
24+
webClient.get()
25+
.uri("message/{idx}", 1L)
26+
.exchange().expectBody()
27+
.consumeAsStringWith(System.out::println);
28+
}
29+
30+
@Test
31+
public void test_insert() throws Exception {
32+
webClient.post()
33+
.uri("message")
34+
.contentType(MediaType.APPLICATION_JSON)
35+
.syncBody("{\"content\": \"h2\"}")
36+
.exchange().expectBody()
37+
.consumeAsStringWith(System.out::println);
38+
}
39+
40+
@Test
41+
public void test_update() throws Exception {
42+
webClient.put()
43+
.uri("message")
44+
.contentType(MediaType.APPLICATION_JSON)
45+
.syncBody("{\"idx\": 1, \"content\": \"h2\"}")
46+
.exchange().expectBody()
47+
.consumeAsStringWith(System.out::println);
48+
}
49+
50+
@Test
51+
public void test_deleteByIdx() throws Exception {
52+
webClient.delete()
53+
.uri("message/{idx}", 1L)
54+
.exchange().expectStatus().isOk();
55+
}
56+
57+
}

0 commit comments

Comments
 (0)