├── 04. Membuat Projek Spring Boot dengan Spring Initializr.md
├── 02. Pengenalan REST.md
├── Istilah pada Spring.md
├── 01. Pengenalan Web Service.md
├── 03. Membuat Projek Maven.md
├── 05. Membuat Rest Controller.md
└── Draft New.md
/04. Membuat Projek Spring Boot dengan Spring Initializr.md:
--------------------------------------------------------------------------------
1 | # Membuat Projek Spring Boot dengan Spring Initializr
2 | - Akses http://start.spring.io (Spring Initializr)
3 | - Generate a "Maven Project" with "Java" and Spring Boot "1.5.6" (Stable Release)
4 | - Untuk Project Metadata,
5 | - Isi Group, misal: com.training.web
6 | - Isi Artifact, misal: projek-pertama
7 | - Pilih Dependencies
8 | - Web, digunakan untuk membuat web aplikasi
9 | - Devtools, digunakan untuk membuat proses pengembangan aplikasi lebih mudah, dikarenakan aplikasi akan reboot secara otomatis jika ada perubahan file
10 | - H2, digunakan untuk menggunakan in memory database
11 | - Security, digunakan untuk menambahkan spring security ke aplikasi
12 | - JPA, digunakan untuk menghubungkan aplikasi ke database
13 | - Klik Generate Project
14 | - Ekstrak file .zip dari projek
15 | - Import projek
16 | - File > Import > Existing Maven Projects
17 |
--------------------------------------------------------------------------------
/02. Pengenalan REST.md:
--------------------------------------------------------------------------------
1 | ## Pengenalan REST
2 | REST (Representational State Transfer) dikenalkan dan didefinisikan pada tahun 2000 oleh Roy Fielding pada saat disertasi doktoralnya. REST merupakan suatu gaya arsitektur untuk mendesain sistem terdistribusi.
3 |
4 | ## Prinsip REST
5 | - __Resources__, mengekspos struktur direktori URI yang mudah dipahami
6 | - Suatu resource mempunyai URI (Uniform Resource Identifier)
7 | - Suatu resrouce dapat memiliki representasi yang berbeda: XML, HTML atau JSON. Umumnya JSON digunakan untuk REST.
8 | - __Representations__, mengirimkan JSON atau XML untuk merepresentasikan objek data dan atribut
9 | - __Messages__, menggunakan method HTTP (HyperText Transfer Protocol) seperti GET, POST, PUT dan DELETE
10 | - __Stateless__, tidak ada session yang disimpan di server, session disimpan oleh client.
11 |
12 | ## HTTP methods
13 | Menggunakan method HTTP untuk memapingkan operasi CRUD(Create, Retrieve, Update, Delete) ke request HTTP
14 |
15 | Method | Deskripsi | URI
16 | ------------ | ------------- | -------------
17 | GET | Digunakan untuk mendapatkan suatu informasi | GET /addresses/1
18 | POST | Digunakan untuk membuat resource baru | POST /addresses
19 | PUT | Digunakan untuk mengupdate resource yang sudah ada. Pada saat proses update, jika hanya beberapa elemen data yang tersedia maka sisa elemen data yang tidak ada akan diupdate null | PUT /addresses/1
20 | PATCH | Digunakan untuk mengupdate spesifik elemen data pada suatu resource | PATCH /addresses/1
21 | DELETE | Digunakan untuk menghapus resource | DELETE /addresses/1
22 |
23 | ## Status Kode HTTP
24 | Status kode HTTP menunjukkan hasil atau respon dari suatu request HTTP.
25 |
26 | Kode | Deskripsi
27 | ------------ | -------------
28 | 1XX | Informasi
29 | 2XX | Sukses
30 | 3XX | Redirection
31 | 4XX | Error pada klien
32 | 5XX | Error pada server
33 |
34 | ## Media Type
35 | __Accept__ dan __Content-Type__ pada HTTP header digunakan untuk menggambarkan konten yang sedang dikirimkan atau direquest didalam HTTP request. Klien harus mengatur Accept menjadi "application/json", jika klien merequest respon dalam bentuk JSON. sebaliknya, ketika mengirimkan data pada saat melakukan request, klien harus mengatur Content-Type menjadi "application/xml" jika klien mengirimkan data dalam bentuk XML.
36 |
37 | ## Dokumentasi Service Definition
38 | Tools yang digunakan untuk dokumentasi service definition adalah
39 | - WADL (Web Application Definition Language)
40 | - Swagger
41 |
--------------------------------------------------------------------------------
/Istilah pada Spring.md:
--------------------------------------------------------------------------------
1 | ## Daftar Istilah Pada Spring
2 |
3 | Istilah | Deskripsi
4 | ------------ | -------------
5 | @Autowired | Anotasi yang digunakan untuk melakukan inject instance dari suatu bean ke objek yang memiliki dependency
6 | @Configuration | Anotasi yang digunakan agar Spring container dapat membuat definisi bean dari suatu kelas dan menunjukkan bahwa suatu kelas mendeklarasikan satu atau lebih method @bean (kelas konfigurasi). (Best practice) Kelas yang mendefinisikan method main dapat menjadi kelas @Configuration utama. Tidak semua konfigurasi harus diletakkan dalam 1 kelas, anotasi @Import dapat digunakan untuk mengimport kelas @Configuration tambahan. Cara lain dapat menggunakan @ComponentScan untuk mencari secara otomatis kelas @Configuration.
7 | @Component | Anotasi yang digunakan agar Spring container dapat membuat definisi bean dari suatu kelas
8 | @ComponentScan | Anotasi yang digunakan untuk melakukan scan @Component, @Service, @Controller, @RestController, @Repository pada saat aplikasi mulai dijalankan, ketika @Component, @Service, @Controller, @RestController, @Repository ditemukan disinilah proses pembentukan bean terjadi yang nantinya akan digunakan untuk proses dependency injection
9 | @Controller | Anotasi yang digunakan agar Spring container dapat membuat definisi bean dari suatu kelas dan menunjukkan kelas tersebut adalah kelas controller
10 | @Repository | Anotasi yang digunakan agar Spring container dapat membuat definisi bean dari suatu kelas dan menunjukkan kelas tersebut adalah kelas repository
11 | @RestController | Anotasi yang digunakan agar Spring container dapat membuat definisi bean dari suatu kelas dan menunjukkan kelas tersebut adalah kelas rest controller
12 | @RequestMapping | Anotasi yang digunakan untuk melakukan mapping url dengan method
13 | @Service | Anotasi yang digunakan agar Spring container dapat membuat definisi bean dari suatu kelas dan menunjukkan kelas tersebut adalah kelas service
14 | @SpringBootApplication | Anotasi yang digunakan untuk menggantikan deklarasi @Configuration, @EnableAutoConfiguration dan @ComponentScan secara bersamaan dengan menggunakan atribut default dari masing-masing anotasi yang digantikan tadi. Untuk @ComponentScan atribut default untuk package yang discan adalah package yang ada pada kelas yang memiliki anotasi ini
15 | @EnableAutoConfiguration | Anotasi yang digunakan agar Spring dapat melakukan konfigurasi secara otomatis berdasarkan dependency jar yang ditambahkan. (Best practice) Dalam satu projek Spring, anotasi @EnableAutoConfiguration hanya boleh digunakan satu kali dan biasanya ditambahkan hanya di kelas @Configuration utama.
16 | Bean | Objek yang dibuat dan diatur oleh Spring IoC Container
17 | Dispatcher Servlet atau Front Controller | Program yang digunakan untuk mengatur alur kerja pemrosesan request web pada Spring
18 | IoC (Inverse of Control) atau Dependency Injection | Spring akan mengatur dependency suatu objek dengan membuat suatu instance atas dependency objek tersebut
19 | Runtime | Waktu pada saat program mulai dijalankan pada komputer (tahap compile)
20 | Servlet | Program kecil pada web server Java yang akan berjalan secara otomatis sebagai bentuk respon dari inputan user
21 |
--------------------------------------------------------------------------------
/01. Pengenalan Web Service.md:
--------------------------------------------------------------------------------
1 | # Outline
2 | - Apa itu Web Service?
3 | - Pertanyaan-Pertanyaan Penting Terkait Web Service
4 | - Web Service - Key Terminology
5 | - Pengenalan RESTful Web Service
6 |
7 | # Apa itu Web Service?
8 | > Software system designed to support interoperable machine-to-machine interaction over a network. - W3C (World Wide Web Consortium)
9 |
10 | Berdasarkan pengertian dari W3C, web service adalah sistem perangkat lunak yang didesain untuk pertukaran dan pemanfaatan informasi dari interaksi mesin-ke-mesin melalui suatu jaringan.
11 |
12 | 3 Karakteristik dari Web Service:
13 | - Didesain untuk interaksi mesin-ke-mesin (atau aplikasi-ke-aplikasi)
14 | - Harus dapat bertukar dan memanfaatkan informasi, tidak bergantung pada suatu teknologi
15 | - Harus dapat berkomunikasi melalui jaringan
16 |
17 | Contoh Web Service : SOAP dan RESTful
18 |
19 | # Pertanyaan-Pertanyaan Penting Terkait Web Service
20 | ## Bagaimana pertukaran data diantara aplikasi berlangsung?
21 | - Input ke web service disebut Request.
22 | - Output dari web service disebut Response.
23 |
24 | Jika suatu aplikasi membutuhkan suatu data dari web service maka aplikasi tersebut akan melakukan request ke web service kemudian web service akan memproses request tersebut dan memberikan output atau response berupa data yang dibutuhkan oleh aplikasi tersebut.
25 |
26 | ## Bagaimana membuat web service tidak bergantung pada teknologi tertentu (platform independent)?
27 | Dengan menggunakan format pertukaran data baik pada Request ataupun Response.
28 |
29 | Format data yang dapat digunakan untuk request dan response adalah
30 | - XML (eXtensible Markup Language)
31 | ``` xml
32 |
33 | 100001
34 |
35 | ```
36 |
37 | - JSON (JavaScript Object Notation)
38 | ``` json
39 | [
40 | {
41 | "id": 100001,
42 | "name": "Toko Mandiri"
43 | },
44 | {
45 | "id": 100002,
46 | "name": "Toko Jaya"
47 | }
48 | ]
49 | ```
50 |
51 | ## Bagaimana suatu aplikasi dapat mengetahui format request dan response suatu web service?
52 | Dengan menyediakan service definition:
53 | - Request/Response Format: XML atau JSON
54 | - Struktur Request
55 | - Struktur Response
56 | - Endpoint: Bagaimana cara memanggil suatu service biasanya berupa URL
57 |
58 | # Web Service - Key Terminology
59 | - Request dan Response
60 | - Request adalah input ke web service
61 | - Response adalah output dari web service
62 | - Format pertukaran data
63 | - XML dan JSON merupakan format yang digunakan oleh Request atau Response pada saat pertukaran data atau informasi.
64 | - Service Provider atau Server
65 | Aplikasi yang menyediakan service yang akan digunakan oleh service consumer atau klien.
66 | - Service Consumer atau Klien
67 | Aplikasi yang menggunakan service yang disediakan oleh service provider atau server.
68 | - Service Definition
69 | - Format Request/Response
70 | - Struktur Request
71 | - Struktur Response
72 | - Endpoint, bagaimana cara memanggil suatu service biasanya berupa URL.
73 | - Transport
74 | - HTTP
75 | Suatu protokol yang digunakan untuk berkomunikasi melalui internet
76 |
77 | ## Pengenalan RESTful Web Service
78 | https://github.com/tedydarmawan/SpringBoot/blob/master/02.%20Pengenalan%20REST.md
79 |
80 |
81 |
82 |
83 |
--------------------------------------------------------------------------------
/03. Membuat Projek Maven.md:
--------------------------------------------------------------------------------
1 | ## Membuat Projek Maven
2 |
3 | Langkah-langkah membuat projek maven di Eclipse atau Spring Tool Suite (STS):
4 | 1. Klik File > New > Maven Project
5 | 2. Centang "Create a simple project (skip archetype selection)"
6 | 3. Isi Group Id: "com.mayora.web"
7 | 4. Isi Artifact Id: "sample-project".
8 |
9 | Semua projek Maven memiliki Group Id dan Artifact Id. Group Id + Artifact Id = Nama Projek.
10 | 5. Biarkan Version: "0.0.1-SNAPSHOT" dan packaging: "jar".
11 |
12 | SNAPSHOT menunjukkan bahwa projek sedang dalam fase development.
13 | 6. Klik Finish
14 |
15 | #### Struktur Projek
16 | src/main/java = source code java
17 |
18 | src/test/java = source code junit java
19 |
20 | #### Dependency
21 | Semua eksternal jar/library yang berhubungan dengan projek
22 |
23 | #### Cara manual mengatur dependency
24 | Download jar secara manual dan letakkan di dalam projek
25 |
26 | #### Maven
27 | Build tool yang dapat digunakan untuk mengatur dependency (dependency management) dengan cara mendownload jar yang berhubungan dengan projek secara otomatis.
28 |
29 | pom.xml = Project Object Model, File konfigurasi untuk projek Maven, yang medefinisikan semua dependency (eksternal jar/library) yang terkait dengan projek.
30 | ``` java
31 |
32 | 4.0.0
33 | com.mayora.web
34 | sample-project
35 | 0.0.1-SNAPSHOT
36 |
37 | ```
38 |
39 | ## Menambahkan Dependency ke Maven
40 | Cari dependency yang akan ditambahkan di Maven repository, misal spring-core:
41 | ``` java
42 |
43 | org.springframework
44 | spring-core
45 | 4.3.8.RELEASE
46 |
47 | ```
48 |
49 | Tambahkan dependency tersebut ke dalam pom.xml
50 | ``` java
51 |
52 | 4.0.0
53 | com.mayora.web
54 | sample-project
55 | 0.0.1-SNAPSHOT
56 |
57 |
58 |
59 |
60 | org.springframework
61 | spring-core
62 | 4.3.8.RELEASE
63 |
64 |
65 |
66 |
67 | ```
68 | Maven akan mendownload dan meletakkan spring-core di CLASSPATH sehingga dependency tersebut dapat digunakan didalam projek. Dapat dilihat pada "Maven Dependencies" di Project Explorer, semua file jar yang terdownload akan muncul disana.
69 |
70 | #### Transitive Dependency
71 | Dependency dari suatu dependency (Transitive dependency). Jika suatu dependency (A) bergantung pada dependency (B) lain maka dependency (B) akan terdownload juga secara otomatis.
72 |
73 | ## 5 Langkah Membuat Projek Spring Boot
74 | 1. Tambahkan Spring Boot Starter Parent dependency
75 | Spring Boot Starter Parent akan menangani versi dari semua dependency Spring, java version dan default plugin. Sehingga dapat memastikan bahwa semua dependency dapat bekerja satu sama lain (compatibility).
76 | ``` xml
77 |
78 | org.springframework.boot
79 | spring-boot-starter-parent
80 | 1.5.3.RELEASE
81 |
82 | ```
83 |
84 | 2. Tambahkan Spring Boot Starter Web dependency
85 | Spring Boot Starter Web akan menangani semua dependency Spring untuk pengembangan aplikasi web termasuk embedded tomcat yang digunakan sebagai web server.
86 | ``` xml
87 |
88 |
89 | org.springframework.boot
90 | spring-boot-starter-web
91 |
92 |
93 | ```
94 |
95 | 3. Override Java Version 8
96 | ``` xml
97 |
98 | 1.8
99 |
100 | ```
101 |
102 | 4. Tambahkan Spring Boot Maven Plugin
103 | Spring Boot Maven Plugin digunakan untuk membuat aplikasi jar/war dan menjalankan aplikasi Spring Boot secara independen
104 | ``` xml
105 |
106 |
107 |
108 | org.springframework.boot
109 | spring-boot-maven-plugin
110 |
111 |
112 |
113 | ```
114 |
115 | 5. Buat Launcher untuk Spring Boot Application
116 |
117 | @SpringBootApplication sama dengan mendeklarasikan @Configuration, @EnableAutoConfiguration, @ComponentScan secara bersamaan dengan default atribut dari masing-masing anotasi.
118 |
119 | #### Application.java
120 | ``` java
121 | import org.springframework.boot.SpringApplication;
122 | import org.springframework.boot.autoconfigure.SpringBootApplication;
123 | import org.springframework.context.ApplicationContext;
124 |
125 | @SpringBootApplication
126 | public class Application {
127 |
128 | public static void main(String[] args){
129 | ApplicationContext ctx = SpringApplication.run(Application.class, args);
130 | }
131 |
132 | }
133 | ```
134 |
135 | ## pom.xml Lengkap
136 | ``` xml
137 |
138 | 4.0.0
139 | com.project.web
140 | sample-project
141 | 0.0.1-SNAPSHOT
142 |
143 |
144 | 1.8
145 |
146 |
147 |
148 | org.springframework.boot
149 | spring-boot-starter-parent
150 | 1.5.3.RELEASE
151 |
152 |
153 |
154 |
155 | org.springframework.boot
156 | spring-boot-starter-web
157 |
158 |
159 |
160 |
161 |
162 |
163 | org.springframework.boot
164 | spring-boot-maven-plugin
165 |
166 |
167 |
168 |
169 |
170 | ```
171 |
--------------------------------------------------------------------------------
/05. Membuat Rest Controller.md:
--------------------------------------------------------------------------------
1 | ## Membuat Rest Controller
2 |
3 | @GetMapping
4 | @PathVariable
5 |
6 | @RequestParam
7 |
8 | JSONView Chrome
9 |
10 |
11 |
12 | ## com/mayora/controller/WelcomeController.java
13 | ``` java
14 | package com.mayora.controller;
15 |
16 | import org.springframework.beans.factory.annotation.Autowired;
17 | import org.springframework.web.bind.annotation.RequestMapping;
18 | import org.springframework.web.bind.annotation.RestController;
19 |
20 | import com.mayora.service.WelcomeService;
21 |
22 | @RestController
23 | public class WelcomeController {
24 |
25 | //Dependency Injection
26 | @Autowired
27 | private WelcomeService service;
28 |
29 | @RequestMapping("/welcome")
30 | public String welcome(){
31 | return service.retrieveWelcomeMessage();
32 | }
33 |
34 | }
35 | ```
36 |
37 | ## com/mayora/controller/SurveyController.java
38 | ``` java
39 | package com.mayora.controller;
40 |
41 | import java.net.URI;
42 | import java.util.List;
43 |
44 | import org.springframework.beans.factory.annotation.Autowired;
45 | import org.springframework.http.ResponseEntity;
46 | import org.springframework.web.bind.annotation.GetMapping;
47 | import org.springframework.web.bind.annotation.PathVariable;
48 | import org.springframework.web.bind.annotation.PostMapping;
49 | import org.springframework.web.bind.annotation.RequestBody;
50 | import org.springframework.web.bind.annotation.RequestMapping;
51 | import org.springframework.web.bind.annotation.RequestMethod;
52 | import org.springframework.web.bind.annotation.RequestParam;
53 | import org.springframework.web.bind.annotation.RestController;
54 | import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
55 |
56 | import com.mayora.model.Question;
57 | import com.mayora.service.SurveyService;
58 |
59 | @RestController
60 | public class SurveyController {
61 |
62 | @Autowired
63 | private SurveyService surveyService;
64 |
65 | @GetMapping("surveys/{surveyId}/questions")
66 | public List retrieveQuestionsForSurvey(@PathVariable String surveyId){
67 | return surveyService.retrieveQuestions(surveyId);
68 | }
69 |
70 | @GetMapping("surveys/{surveyId}/questions/{questionId}")
71 | public Question retrieveQuestionDetails(@PathVariable String surveyId, @PathVariable String questionId){
72 | return surveyService.retrieveQuestion(surveyId, questionId);
73 | }
74 |
75 | //@GetMapping("surveys/{surveyId}/question")
76 | @RequestMapping(path="surveys/{surveyId}/question", method=RequestMethod.GET)
77 | public Question retrieveQuestion(@PathVariable String surveyId, @RequestParam String id){
78 | return surveyService.retrieveQuestion(surveyId, id);
79 | }
80 |
81 | @PostMapping("surveys/{surveyId}/questions")
82 | public ResponseEntity addQuestionToSurvey(@PathVariable String surveyId, @RequestBody Question newQuestion){
83 | Question question = surveyService.addQuestion(surveyId, newQuestion);
84 |
85 | if(question == null)
86 | return ResponseEntity.noContent().build();
87 |
88 | URI location = ServletUriComponentsBuilder.fromCurrentRequest()
89 | .path("/{id}").buildAndExpand(question.getId()).toUri();
90 |
91 | return ResponseEntity.created(location).build();
92 | }
93 |
94 | }
95 | ```
96 |
97 | ## com/mayora/model/Question.java
98 | ``` java
99 | package com.mayora.model;
100 |
101 | import java.util.List;
102 |
103 | public class Question {
104 | private String id;
105 | private String description;
106 | private String correctAnswer;
107 | private List options;
108 |
109 | public Question() {
110 | // TODO Auto-generated constructor stub
111 | }
112 |
113 | public Question(String id, String description, String correctAnswer, List options) {
114 | super();
115 | this.id = id;
116 | this.description = description;
117 | this.correctAnswer = correctAnswer;
118 | this.options = options;
119 | }
120 |
121 | public String getId() {
122 | return id;
123 | }
124 |
125 | public void setId(String id) {
126 | this.id = id;
127 | }
128 |
129 | public String getDescription() {
130 | return description;
131 | }
132 |
133 | public void setDescription(String description) {
134 | this.description = description;
135 | }
136 |
137 | public String getCorrectAnswer() {
138 | return correctAnswer;
139 | }
140 |
141 | public void setCorrectAnswer(String correctAnswer) {
142 | this.correctAnswer = correctAnswer;
143 | }
144 |
145 | public List getOptions() {
146 | return options;
147 | }
148 |
149 | public void setOptions(List options) {
150 | this.options = options;
151 | }
152 |
153 | }
154 | ```
155 |
156 | ## com/mayora/model/Survey.java
157 | ``` java
158 | package com.mayora.model;
159 |
160 | import java.util.List;
161 |
162 | public class Survey {
163 | private String id;
164 | private String title;
165 | private String description;
166 | private List questions;
167 |
168 | public Survey(String id, String title, String description, List questions) {
169 | super();
170 | this.id = id;
171 | this.title = title;
172 | this.description = description;
173 | this.questions = questions;
174 | }
175 |
176 | public String getId() {
177 | return id;
178 | }
179 |
180 | public void setId(String id) {
181 | this.id = id;
182 | }
183 |
184 | public String getTitle() {
185 | return title;
186 | }
187 |
188 | public void setTitle(String title) {
189 | this.title = title;
190 | }
191 |
192 | public String getDescription() {
193 | return description;
194 | }
195 |
196 | public void setDescription(String description) {
197 | this.description = description;
198 | }
199 |
200 | public List getQuestions() {
201 | return questions;
202 | }
203 |
204 | public void setQuestions(List questions) {
205 | this.questions = questions;
206 | }
207 |
208 | }
209 | ```
210 |
211 | ## com/mayora/service/WelcomeService.java
212 | ``` java
213 | package com.mayora.service;
214 |
215 | import org.springframework.stereotype.Component;
216 |
217 | //Spring will manage this bean and create an instance of this bean
218 | @Component
219 | public class WelcomeService {
220 | public String retrieveWelcomeMessage(){
221 | return "Selamat Datang";
222 | }
223 | }
224 | ```
225 |
226 | ## com/mayora/service/SurveyService.java
227 | ``` java
228 | package com.mayora.service;
229 |
230 | import java.math.BigInteger;
231 | import java.security.SecureRandom;
232 | import java.util.ArrayList;
233 | import java.util.Arrays;
234 | import java.util.List;
235 |
236 | import org.springframework.stereotype.Component;
237 |
238 | import com.mayora.model.Question;
239 | import com.mayora.model.Survey;
240 |
241 | @Component
242 | public class SurveyService {
243 | private static List surveys = new ArrayList<>();
244 | static{
245 | Question question1 = new Question("Question1", "Who is responsible for developing the application?", "Development", Arrays.asList("Development", "Application Support", "Master Data Management", "Demmand Planner", "Technical Business Requirement"));
246 | Question question2 = new Question("Question2", "Who is responsible for supporting distributor in the area?", "Application Support", Arrays.asList("Development", "Application Support", "Master Data Management", "Demmand Planner", "Technical Business Requirement"));
247 | Question question3 = new Question("Question3", "Who is responsible for managing master data such as discount and price?", "Master Data Management", Arrays.asList("Development", "Application Support", "Master Data Management", "Demmand Planner", "Technical Business Requirement"));
248 | Question question4 = new Question("Question4", "Who is responsible for forecasting demand of market?", "Demmand Planner", Arrays.asList("Development", "Application Support", "Master Data Management", "Demmand Planner", "Technical Business Requirement"));
249 | Question question5 = new Question("Question5", "Who is responsible for testing and creating requirement of new application development?", "Technical Business Requirement", Arrays.asList("Development", "Application Support", "Master Data Management", "Demmand Planner", "Technical Business Requirement"));
250 |
251 | List questions = new ArrayList<>(Arrays.asList(question1, question2, question3, question4, question5));
252 |
253 | Survey survey = new Survey("Survey1", "System Support Job Description", "Questionary about job description of each department in System Support Division", questions);
254 | surveys.add(survey);
255 | }
256 |
257 | public List retrieveAllSurveys(){
258 | return surveys;
259 | }
260 |
261 | public Survey retrieveSurvey(String surveyId){
262 | for(Survey survey: surveys){
263 | if(survey.getId().equals(surveyId)){
264 | return survey;
265 | }
266 | }
267 | return null;
268 | }
269 |
270 | public List retrieveQuestions(String surveyId){
271 | Survey survey = retrieveSurvey(surveyId);
272 |
273 | if(survey == null){
274 | return null;
275 | }
276 |
277 | return survey.getQuestions();
278 | }
279 |
280 | public Question retrieveQuestion(String surveyId, String questionId){
281 | Survey survey = retrieveSurvey(surveyId);
282 |
283 | if(survey == null){
284 | return null;
285 | }
286 |
287 | for(Question question: survey.getQuestions()){
288 | if(question.getId().equals(questionId)){
289 | return question;
290 | }
291 | }
292 |
293 | return null;
294 | }
295 |
296 | private SecureRandom random = new SecureRandom();
297 |
298 | public Question addQuestion(String surveyId, Question question){
299 | Survey survey = retrieveSurvey(surveyId);
300 |
301 | if(survey == null){
302 | return null;
303 | }
304 |
305 | String randomId = new BigInteger(130, random).toString(32);
306 | question.setId(randomId);
307 |
308 | survey.getQuestions().add(question);
309 |
310 | return question;
311 | }
312 |
313 |
314 | }
315 | ```
316 |
317 | ## com/mayora/springboot/Application.java
318 | ``` java
319 | package com.mayora.springboot;
320 |
321 | import org.springframework.boot.SpringApplication;
322 | import org.springframework.boot.autoconfigure.SpringBootApplication;
323 | import org.springframework.context.annotation.ComponentScan;
324 |
325 | @SpringBootApplication
326 | @ComponentScan("com.mayora")
327 | public class Application {
328 |
329 | public static void main(String[] args){
330 | SpringApplication.run(Application.class, args);
331 | }
332 |
333 | }
334 | ```
335 |
336 | ## pom.xml
337 | ``` xml
338 |
339 | 4.0.0
340 | com.mayora.springboot
341 | sample-project
342 | 0.0.1-SNAPSHOT
343 |
344 |
345 | 1.8
346 |
347 |
348 |
349 | org.springframework.boot
350 | spring-boot-starter-parent
351 | 1.5.3.RELEASE
352 |
353 |
354 |
355 |
356 | org.springframework.boot
357 | spring-boot-starter-web
358 |
359 |
360 |
361 | com.fasterxml.jackson.dataformat
362 | jackson-dataformat-xml
363 |
364 |
365 |
366 | org.springframework.boot
367 | spring-boot-starter-actuator
368 |
369 |
370 |
371 | org.springframework.data
372 | spring-data-rest-hal-browser
373 |
374 |
375 |
376 | org.springframework.boot
377 | spring-boot-devtools
378 | true
379 |
380 |
381 |
382 |
383 |
384 |
385 | org.springframework.boot
386 | spring-boot-maven-plugin
387 |
388 |
389 |
390 |
391 |
392 | ```
393 |
394 | ## Konfigurasi Eksternal application.properties
395 | Spring bisa menggunakan konfigurasi eksternal dengan menggunakan application.properties. Berikut ini contoh konfigurasi eksternal untuk mengaktifkan mode DEBUG di Spring.
396 |
397 | #### /src/main/resources/application.properties
398 | ``` java
399 | logging.level.org.springframework: DEBUG
400 | ```
401 |
402 | ## Spring Developer Tools
403 | Pada saat proses pengembangan aplikasi, setiap kali ada perubahan kode maka aplikasi Spring Boot yang sedang berjalan harus dihentikan terlebih dahulu kemudian dijalankan kembali secara manual (restart manual). Dengan adanya Spring Developer Tools dapat membantu developer untuk mempersingkat proses restart manual tadi sehingga ketika ada perubahan kode aplikasi Spring Boot otomatis akan melakukan restart agar perubahan kode tersebut masuk ke dalam aplikasi yang sedang berjalan. Untuk itu maka diperlukan untuk menambahkan dependency Spring Developer Tools ke dalam projek Java.
404 |
405 | ``` xml
406 |
407 | org.springframework.boot
408 | spring-boot-devtools
409 | true
410 |
411 | ```
412 |
--------------------------------------------------------------------------------
/Draft New.md:
--------------------------------------------------------------------------------
1 | # RESTful Web Services
2 |
3 | ## Social Media Application
4 | User -> Post
5 |
6 | - Memperoleh semua user - GET /users
7 | - Membuat user - POST /users
8 | - Memperoleh spesifik user - Get /users/{id} -> /users/1
9 | - Hapus spesifik user - DELETE /users/{id} -> /users/1
10 |
11 | - Memperoleh semua post dari spesifik user - GET users/{id}/posts
12 | - Membuat post untuk spesifik user - POST /users/{id}/posts
13 | - Memperoleh detail dari spesifik post dari spesifik user - GET /users/{id}/posts/{post_id}
14 |
15 | ## Membuat REST service serderhana dengan mengembalikan suatu String
16 | Buat kelas HelloWorldController.java
17 | ``` java
18 | import org.springframework.web.bind.annotation.GetMapping;
19 | import org.springframework.web.bind.annotation.RestController;
20 |
21 | @RestController
22 | public class HelloWorldController {
23 |
24 | @GetMapping(path = "/hello-world")
25 | public String getHello(){
26 | return "Hello World";
27 | }
28 |
29 | }
30 | ```
31 |
32 | - @RestController digunakan untuk menandakan bahwa kelas tersebut adalah suatu controller rest.
33 | - @GetMapping digunakan untuk memappingkan method dengan URI dengan menggunakan method HTTP GET sehingga pada saat user mengakses URI tersebut pada browser maka method yang diberikan anotasi @GetMapping tersebut akan dieksekusi.
34 |
35 |
36 | ## Membuat REST service sederhana dengan mengembalikan suatu Bean
37 | Buatlah kelas HelloWorldBean.java
38 | ``` java
39 | public class HelloWorldBean {
40 |
41 | private String message;
42 |
43 | public HelloWorldBean(String message) {
44 | this.message = message;
45 | }
46 |
47 | public String getMessage() {
48 | return message;
49 | }
50 |
51 | public void setMessage(String message) {
52 | this.message = message;
53 | }
54 |
55 | @Override
56 | public String toString() {
57 | return "HelloWorldBean [message=" + message + "]";
58 | }
59 |
60 | }
61 | ```
62 |
63 | Pada kelas HelloWorldController.java, tambahkan method getHelloBean()
64 |
65 | ``` java
66 | import org.springframework.web.bind.annotation.GetMapping;
67 | import org.springframework.web.bind.annotation.RestController;
68 |
69 | @RestController
70 | public class HelloWorldController {
71 |
72 | @GetMapping(path = "/hello-world")
73 | public String getHello(){
74 | return "Hello World";
75 | }
76 |
77 | @GetMapping(path = "/hello-world-bean")
78 | public HelloWorldBean getHelloBean(){
79 | return new HelloWorldBean("Hello World");
80 | }
81 |
82 | }
83 | ```
84 |
85 | ## Membuat REST service sederhana dengan menggunakan path variable
86 | Pada kelas HelloWorldController.java, tambahkan method getHelloPathVariable()
87 |
88 | ``` java
89 | import org.springframework.web.bind.annotation.GetMapping;
90 | import org.springframework.web.bind.annotation.RestController;
91 |
92 | @RestController
93 | public class HelloWorldController {
94 |
95 | @GetMapping(path = "/hello-world")
96 | public String getHello(){
97 | return "Hello World";
98 | }
99 |
100 | @GetMapping(path = "/hello-world-bean")
101 | public HelloWorldBean getHelloBean(){
102 | return new HelloWorldBean("Hello World");
103 | }
104 |
105 | @GetMapping(path = "/hello-world/{name}")
106 | public HelloWorldBean getHelloPathVariable(@PathVariable String name){
107 | return new HelloWorldBean(String.format("Hello World, %s", name));
108 | }
109 |
110 | }
111 | ```
112 |
113 | ## Membuat User Bean dan User Service
114 | Buat kelas User.java
115 | ``` java
116 | import java.util.Date;
117 |
118 | public class User {
119 | private Integer id;
120 | private String name;
121 | private Date birthDate;
122 |
123 | public User() {
124 |
125 | }
126 |
127 | public User(Integer id, String name, Date birthDate) {
128 | this.id = id;
129 | this.name = name;
130 | this.birthDate = birthDate;
131 | }
132 |
133 | public Integer getId() {
134 | return id;
135 | }
136 |
137 | public void setId(Integer id) {
138 | this.id = id;
139 | }
140 |
141 | public String getName() {
142 | return name;
143 | }
144 |
145 | public void setName(String name) {
146 | this.name = name;
147 | }
148 |
149 | public Date getBirthDate() {
150 | return birthDate;
151 | }
152 |
153 | public void setBirthDate(Date birthDate) {
154 | this.birthDate = birthDate;
155 | }
156 |
157 | @Override
158 | public String toString() {
159 | return "User [id=" + id + ", name=" + name + ", birthDate=" + birthDate + "]";
160 | }
161 |
162 | }
163 | ```
164 |
165 | Buat kelas UserDaoService.java
166 | ``` java
167 | import java.util.ArrayList;
168 | import java.util.Date;
169 | import java.util.List;
170 |
171 | import org.springframework.stereotype.Component;
172 |
173 | @Component
174 | public class UserDaoService {
175 | private static List users = new ArrayList<>();
176 |
177 | private static int usersCount = 3;
178 |
179 | static{
180 | users.add(new User(1, "Tedy Darmawan", new Date()));
181 | users.add(new User(2, "Tri Apriyono", new Date()));
182 | users.add(new User(3, "Denny Krisbiantoro", new Date()));
183 | }
184 |
185 | public List findAll(){
186 | return users;
187 | }
188 |
189 | public User save(User user){
190 | if(user.getId() == null){
191 | user.setId(++usersCount);
192 | }
193 | users.add(user);
194 | return user;
195 | }
196 |
197 | public User findOne(int id){
198 | for(User user: users){
199 | if(user.getId() == id){
200 | return user;
201 | }
202 | }
203 | return null;
204 | }
205 |
206 | }
207 | ```
208 | ## Implementasi method GET untuk memperoleh data User
209 | Buat kelas UserController.java
210 | ``` java
211 | import java.util.List;
212 |
213 | import org.springframework.beans.factory.annotation.Autowired;
214 | import org.springframework.web.bind.annotation.GetMapping;
215 | import org.springframework.web.bind.annotation.PathVariable;
216 | import org.springframework.web.bind.annotation.RestController;
217 |
218 | @RestController
219 | public class UserController {
220 |
221 | @Autowired
222 | private UserDaoService service;
223 |
224 | @GetMapping(path = "/users")
225 | public List getAllUsers(){
226 | return service.findAll();
227 | }
228 |
229 | @GetMapping(path = "/users/{id}")
230 | public User getUser(@PathVariable int id){
231 | return service.findOne(id);
232 | }
233 |
234 | }
235 | ```
236 |
237 | Untuk mengubah output format tanggal JSON, pada application.properties tambahkan properti berikut ini:
238 | ``` properties
239 | spring.jackson.serialization.write-dates-as-timestamps=false
240 | ```
241 |
242 | //inspect Google Chrome untuk melihat Header dan Response
243 |
244 | ## Implementasi method POST untuk membuat data User
245 | Pada kelas UserController.java, tambahkan method POST createUser()
246 | ``` java
247 | import java.util.List;
248 |
249 | import org.springframework.beans.factory.annotation.Autowired;
250 | import org.springframework.web.bind.annotation.GetMapping;
251 | import org.springframework.web.bind.annotation.PathVariable;
252 | import org.springframework.web.bind.annotation.PostMapping;
253 | import org.springframework.web.bind.annotation.RequestBody;
254 | import org.springframework.web.bind.annotation.RestController;
255 |
256 | @RestController
257 | public class UserController {
258 |
259 | @Autowired
260 | private UserDaoService service;
261 |
262 | @GetMapping(path = "/users")
263 | public List getAllUsers(){
264 | return service.findAll();
265 | }
266 |
267 | @GetMapping(path = "/users/{id}")
268 | public User getUser(@PathVariable int id){
269 | return service.findOne(id);
270 | }
271 |
272 | @PostMapping("/users")
273 | public void createUser(@RequestBody User user){
274 | User savedUser = service.save(user);
275 | }
276 |
277 | }
278 | ```
279 |
280 | Untuk menguji web service dengan method HTTP POST maka perlu menggunakan tools yakni Postman, yang dapat didownload dari http://www.getpostman.com. Postman merupakan rest client yang dapat digunakan untuk menguji aplikasi web service.
281 |
282 | Pada Postman,
283 | - Pilih Method HTTP POST
284 | - Masukan URL http://localhost:8080/users
285 | - Masukan Request Body, pada Tab Body, pilih raw dan JSON (application/json)
286 | ``` json
287 | {
288 | "name": "New User",
289 | "birthDate": "2017-08-04T08:10:35.979+0000"
290 | }
291 | ```
292 | - Klik Send
293 |
294 | ## Implementasi method POST untuk membuat data User dan mengganti kode status HTTP
295 | Pada kelas UserController.java, ubah body method createUser()
296 | ``` java
297 | import java.net.URI;
298 | import java.util.List;
299 |
300 | import org.springframework.beans.factory.annotation.Autowired;
301 | import org.springframework.http.ResponseEntity;
302 | import org.springframework.web.bind.annotation.GetMapping;
303 | import org.springframework.web.bind.annotation.PathVariable;
304 | import org.springframework.web.bind.annotation.PostMapping;
305 | import org.springframework.web.bind.annotation.RequestBody;
306 | import org.springframework.web.bind.annotation.RestController;
307 | import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
308 |
309 | @RestController
310 | public class UserController {
311 |
312 | @Autowired
313 | private UserDaoService service;
314 |
315 | @GetMapping(path = "/users")
316 | public List getAllUsers(){
317 | return service.findAll();
318 | }
319 |
320 | @GetMapping(path = "/users/{id}")
321 | public User getUser(@PathVariable int id){
322 | return service.findOne(id);
323 | }
324 |
325 | @PostMapping("/users")
326 | public ResponseEntity