春コース7日目

53753 ワード

韓日


RESTful Webプロジェクト
  • start springによるプロジェクト
  • の作成
    クエリ
  • GETユーザ
  • POST新規ユーザ
  • を作成する.
  • PUTユーザ情報更新
  • 削除
  • DELETEユーザ
  • REST APIをpmaプロジェクト-1-に適用する
  • GETを使用して従業員
  • を検索
  • POSTを使用して新入社員
  • を入力する.

    RESTful Webプロジェクト


    start springによるプロジェクトの作成


    https://start.spring.io/
    上記のリンクからアイテムを作成します.


    作成を続行>生成した圧縮ファイルをワークスペースに移動して解凍します.
    を選択して、

    実行時に出力されるページ.

    spring-boot-devtoolsを追加します.迅速な使用を支援します.

    GETユーザーの表示



    新しいクラスの作成
    - UserController -
    @RestController
    @RequestMapping("/users")	// http://localhost:8080/users
    public class UserController {
    
    	@GetMapping
    	public String getUser() {
    		return "유저 리스트 리턴";
    	}
    	@PostMapping
    	public String getCreaterUser() {
    		return "새 유저를 생성";
    	}
    	@PutMapping
    	public String getUpdateUser() {
    		return "유저 업데이트";
    	}
    	@DeleteMapping
    	public String geDeletetUser() {
    		return "유저 삭제";
    	}
    }
    postman http://localhost:8080/usersへの接続確認結果

    GET

    POST

    PUT

    DELETE

    @PathVariableとしてpath変数を使用


    - UserController -
    getUser、getUserListに変更(文字列ベース)
    @GetMapping
    public String getUserList() {
    	return "유저 리스트 리턴";
    }
    @GetMapping(path = "/{userId}")
    public String getUser(@PathVariable("userId") String userId) {
    	return "유저 리스트 중 하나 " + userId;
    }
    受信したidが数値の場合、以下のように変更されます.
    @GetMapping(path = "/{userId}")
    public String getUser(@PathVariable("userId") int userId) {
    	return "유저 리스트 중 하나 " + userId;
    }

    http://localhost:8080/users/0829kujの結果.

    クエリー文字列の入力


    プレイヤー数が多い場合は、毎日リクエストで受け取ると非効率です.
    クエリー・リストとして最小ページと最大制限をアドレスに追加するよう要求します.
    - UserController -
    @GetMapping
    public String getUserList(@RequestParam("page") int page, @RequestParam("limit") int limit) {
    	return "유저 리스트 리턴 페이지: "+ page + ", limit : " + limit;
    }
    http://localhost:8080/users?page=1&limit=10

    正常な応答.
    パラメータなしhttp://localhost:8080/users、要求時にエラーが発生しました.
    defaultValue(デフォルト)を設定してエラーを防止します.
    - UserController -
    // 효율적으로 DB를 사용하기 위해 페이지 수와 한 페이지 당 가져올 데이터수를 지정
    @GetMapping
    public String getUserList(@RequestParam(value= "page", defaultValue = "1") int page, 
    						@RequestParam(value = "limit", defaultValue = "50") int limit,
    						@RequestParam(value = "sort", defaultValue = "desc", required = false) String sort) {
    	return "유저 리스트 리턴 페이지: "+ page + ", limit : " + limit + ", 정렬 : " + sort;
    }
    sortのrequired=falseは、この属性がなくてもエラーが発生しないように設定されています.
    defaultValueが設定されていない場合、if(sort=null)sort="DESC";デフォルト値を個別に記入するために追加する必要がありますが、ここに追加されているので、必要ありません.
    http://localhost:8080/users

    変更前の要求エラー

    defaultValueの追加後にアクセス中にエラーx

    Javaオブジェクトとして返される



    新しいクラスの作成
    -UserRestクラス-
    public class UserRest {
    	private String name;
    	private String email;
    	private String userId;
        // get/set 자동생성
    }
    - UserController -
    @GetMapping(path = "/{userId}")
    public UserRest getUser(@PathVariable("userId") String id) {
    	// java 객체 유저를 리턴
    	UserRest returnUser = new UserRest();
    	returnUser.setName("홍");
    	returnUser.setUserId(id);
    	returnUser.setEmail("[email protected]");
    	// 객체로 리턴 시 RestController에서 json으로 리턴
    	return returnUser;
    }

    http://localhost:8080/users/の後にidを入力して要求すると、入力された洪吉童情報はjsonに戻る.
    =>Javaオブジェクトに戻ると、自動的にjsonタイプで応答します.

    xml受信で返す


    xmlとjson
    リンク~2.13.2バージョン
    - pom.xml -
    バージョンを削除してspring自動管理>pomにします.xml>更新mavenに追加
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>
    - UserController -
    @GetMapping(path = "/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE,
    											MediaType.APPLICATION_XML_VALUE})
    public UserRest getUser(@PathVariable("userId") String id) {
    	// java 객체 유저를 리턴
    	UserRest returnUser = new UserRest();
    	returnUser.setName("홍");
    	returnUser.setUserId(id);
    	returnUser.setEmail("[email protected]");
    	// 객체로 리턴 시 RestController에서 json으로 리턴
    	return returnUser;
    }
    ここでmediaTypeはorgです.springframework.http.MediaType、インポート時にご注意ください.
    Productsプロパティを追加してメディアタイプを指定します.
    xmlとjsonを同時に返すことを許可します.
    再起動後に確認します.

    HeaderのAccept設定をアプリケーション/xmlに変更し、再確認します.

    xmlに戻ることを確認できます.

    HTTP状態コード


    httpステータスコードを一緒に返します.
    httpステータスコード:200対正常応答、400対要求エラー、500対サーバエラー
    httpステータスコードを参照
    - UserController -
    @GetMapping(path = "/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE,
    											MediaType.APPLICATION_XML_VALUE})
    public ResponseEntity<UserRest> getUser(@PathVariable("userId") String id) {
    	// java 객체 유저를 리턴
    	UserRest returnUser = new UserRest();
    	returnUser.setName("홍");
    	returnUser.setUserId(id);
    	returnUser.setEmail("[email protected]");
    	// 객체로 리턴 시 RestController에서 json으로 리턴
    	return new ResponseEntity<UserRest>(returnUser, HttpStatus.BAD_REQUEST);
    }
    @GetMapping("/bad")
    public ResponseEntity<String> badRequest() {
    	return new ResponseEntity<String>("잘못된 요청", HttpStatus.BAD_REQUEST);
    }
    BAD REQUESTをOKに変更



    POST新規ユーザーの作成



    新しいクラスの作成
    - UserRequest -
    public class UserRequest {
    	private String name;
    	private String email;
    	private String password;
    	//getset 자동생성
    }
    - UserController -
    @PostMapping
    public String getCreaterUser(@RequestBody UserRequest user) {
    	return "새 유저를 생성";
    }
    @RequestBody:実際のリクエストのデータ

    postでデータが送信されることを確認
    - UserController -
    @PostMapping
    public ResponseEntity<UserRest> getCreaterUser(@RequestBody UserRequest user) {
    	UserRest returnUser = new UserRest();
    	returnUser.setName(user.getName());
    	returnUser.setEmail(user.getEmail());
    	
    	return new ResponseEntity<UserRest>(returnUser, HttpStatus.CREATED);
    }

    要求が成功したときに表示されます.

    データ検証Validating Request Body


    POSTを使用して入力した値を検証する
    ライブラリのダウングレード pom.xmlに追加します.
    以前と同様にversionラベルを削除してspringを自動的に管理します.
    - UserController -
    @PostMapping
    public ResponseEntity<UserRest> getCreaterUser(@Valid @RequestBody UserRequest user) {
    	UserRest returnUser = new UserRest();
    	returnUser.setName(user.getName());
    	returnUser.setEmail(user.getEmail());
    	
    	return new ResponseEntity<UserRest>(returnUser, HttpStatus.CREATED);
    }
    @Validを使用してuserRequestにアクセスしたユーザーを検証
    -UserRequestクラス-
    @NotBlank(message="이름을 입력해주세요")
    private String name;
    
    @NotBlank(message="이메일을 입력해주세요")
    @Email
    private String email;
    
    @NotNull(message = "패스워드를 입력해주세요")
    @Size(min = 4, max = 10, message = "패스워드의 길이는 4 ~ 10 사이입니다")
    private String password;
    有効性をアシスタントに設定
    再起動後に確認します.(手動でMavenを追加する場合は、変更を適用するには再起動後に確認する必要があります)

    要求が無効な場合、エラーメッセージが出力されます.
    通常のリクエストの場合、上記の有効性が有効になる前の結果と同じであるため、リクエストはスキップされます.

    userId子の保存


    まず、DBを使用せずにリストを作成して保存します.
    - UserController -
    @PostMapping
    public ResponseEntity<UserRest> getCreaterUser(@Valid @RequestBody UserRequest user) {
    	UserRest returnUser = new UserRest();
    	returnUser.setName(user.getName());
    	returnUser.setEmail(user.getEmail());
    	String userId = UUID.randomUUID().toString();	// 랜덤한 고유id를 만듦
    	returnUser.setUserId(userId);
    	
    	if (users == null) users = new HashMap<>();	// 싱클톤 패턴. 선언된 map <문자열, UserRest>가 없으면 새로생성
    	users.put(userId, returnUser);		// map이므로 (유저id, 유저객체) 를 한쌍으로 입력
    	
    	return new ResponseEntity<UserRest>(returnUser, HttpStatus.CREATED);
    }

    postによって新しいユーザが作成されたときにランダムに作成されたuserIdは一緒に保存されます.
    - UserController -
    userIdを使用してユーザーを検索し、返されるように変更し、ない場合はユーザーに通知します.
    @GetMapping(path = "/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE,
    											MediaType.APPLICATION_XML_VALUE})
    public ResponseEntity<UserRest> getUser(@PathVariable("userId") String id) {
    	// java 객체 유저를 리턴
    	if (users.containsKey(id)) {
    		return new ResponseEntity<UserRest>(users.get(id), HttpStatus.OK);	
    	} else {	// userId가 없음을 알림
    		return new ResponseEntity<UserRest>(HttpStatus.NO_CONTENT);
    	}

    以前に作成したユーザのidリクエストをgetとすると、そのユーザの情報が正常に出力されます.

    リクエスト時にNO CONTENTとして指定されているため、何も表示されません.
    リストとして保存されているため、次のサーバでは生成したユーザが初期化され、テスト時に注意してください.

    PUTユーザー情報の更新



    新しいクラスの作成
    - UpdateUserRequest -
    public class UpdateUserRequest {
    	// 유저 객체에서 email을 제외한 name만 업데이트
        @Size(min = 2, message = "이름의 길이는 2자 이상")
    	private String name;
        // getset 자동생성
    }
    - UserController -
    // 업데이트 시 id를 입력 후 body에 업데이트 할 이름을 json으로 입력함
    @PutMapping("/{userId}")
    public UserRest getUpdateUser(@PathVariable("userId") String id,
    							@Valid @RequestBody UpdateUserRequest user) {
    	UserRest savedUser = users.get(id);
    	savedUser.setName(user.getName());		// 이름 수정됨
    	
    	return savedUser;
    }
    入力したuserIdを使用してユーザーを検索します.
    @Valid検証を使用します.
    検証が完了したnameを@RequestBodyに更新します.

    DELETEユーザーの削除


    - UserController -
    @DeleteMapping("/{userId}")
    public ResponseEntity<Void> geDeletetUser(@PathVariable("userId") String id) {
    	users.remove(id);
    	return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
    }

    新規ユーザ作成後に生成されたidを用いて削除要求>削除後GETでidを検索し,no contentと表示されることを確認する.

    REST APIをpmaプロジェクト-1-に適用する


    GETを使用した従業員の検索



    新しいクラス、パッケージの作成
    - EmployeeApiController -
    @RestController
    @RequestMapping("/app-api/employees")
    public class EmployeeApiController {
    	
    	@Autowired
    	private EmployeeRepository empRepo;
    	
    	@GetMapping
    	public Iterable<Employee> getEmployees(){
    		return empRepo.findAll();
    	}
    }
    - Employee -
    @JsonIgnoreを追加し、無限の重複を防止
    // N:N 관계에서는 테이블을 만들어 만든 테이블에 id를 넣고 다른 테이블의 id도 입력한다.
    // CascadeType.PERSIST, CascadeType.REMOVE 제거
    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}, fetch = FetchType.LAZY)  
    @JoinTable(name = "project_employee", joinColumns = @JoinColumn(name="employee_id"),
    				inverseJoinColumns = @JoinColumn(name="project_id"))
    @JsonIgnore		// 이게 없으면 무한으로 서로 검색해서 호출함
    private List<Project> projects;

    http://localhost:8080/app-api/employeesを実行すると、すべての従業員のリストがjsonとして出力されます.
    - EmployeeApiController -
    idを使用して従業員を検索する方法を追加
    @GetMapping("/{id}")
    public Employee getEmployeeById(@PathVariable("id") Long id){
    	return empRepo.findByEmployeeId(id);
    }

    http://localhost:8080/app-api/employees/1を検索すると、IDの従業員情報がjsonとして出力される.

    POSTで新入社員を入力


    - EmployeeApiController -
    // 요청하는 body에 json타입의 새 직원 데이터를 입력 시 새 직원 생성 후 그 직원을 리턴
    @PostMapping(consumes = "application/json")
    @ResponseStatus(HttpStatus.CREATED)		// 상태 201 생성
    public Employee create(@RequestBody Employee employee){
    	return empRepo.save(employee);
    }
    postmanテスト入力を使用する前にcsrf設定を閉じてください
    - SecurityConfiguration -
    @Override
    protected void configure(HttpSecurity http) throws Exception {	
    	...
        http.csrf().disable();	// REST API에서는 csrf설정을 끔
    }

    テスト時に新規従業員を作成し、従業員のデータを返します.
    生成されたemployeeIdを検索すると、同じ結果が得られます.
    ここでは、ないidとして保存する必要があるため、新入社員が格納されます.
    (前回のレッスンでは、empRepo.save(従業員)のidを検索するときにupdateを使用し、そうでない場合はsaveを使用して新入社員を作成するタスクを作成しました.)