///////
Search

알고리즘,SpingBoot_이연재

1. 알고리즘

1.1 문제

1.2 알아야할 사항

해시맵 생성: Map<String,Integer> member = new HashMap<>();
해시맵에 <key, value> 넣기: member.put(key,value);
value값 얻기: value = member.get(key);

1.3 구현

public class 완주하지못한선수 { public String solution(String[] participant, String[] completion) { String answer = ""; //해시맵 생성 <참가자, 동명이인 수> Map<String,Integer> member = new HashMap<>(); //1) 참가자를 해시맵에 넣음. for(int i = 0; i< participant.length; i++){ if(member.containsKey(participant[i])){ //동명이인이 들어오면 value++ int temp = member.get(participant[i]); member.put(participant[i],temp+1); }else{ //처음 들어오는 사람이면 value=1 member.put(participant[i],1); } } //2) 완주한 사람의 value를 1씩 줄임. for(int i = 0; i<completion.length; i++){ int temp = member.get(completion[i]); member.put(completion[i],temp-1); } for (String key : member.keySet()) { //3) member의 key를 전체 순환하면서 if (member.get(key) == 1) { //value가 1인값을 return한다. answer = key; } } return answer; } public static void main(String[] args) { 완주하지못한선수 a = new 완주하지못한선수(); String[] participant = {"mislav", "stanko", "mislav", "ana"}; String[] completion = {"stanko", "ana", "mislav" }; String result = a.solution(participant,completion); System.out.println(result); } }
Java
복사
1) HashMap member에 Participant를 넣는다.
- 넣을때 key는 참가자의 이름으로 하고 동명이인이 있을수 있으므로 value를 그 이름을 가진 사람이 몇명인지(동명이인)로 한다. 따라서 처음 들어오는 사람은 value를 1로 초기화하고 그이후에 동명이인이 들어오면 2,3,4...로 value가 점점 늘어난다.
2) completion에 들어있는 이름을 key로 member에 검색한다. 검색해서 이름이 있으면 value의 값을 1씩 줄인다.
3) member의 key를 돌면서 value가 1인 값을 찾아 return 한다.

2. Spring boot

2-1. API 문서란?

API쓰는법을 써놓은(기술 해놓은) 문서이다.
아래 그림은 깃허브의 API 문서이다.

2-2. Path parameter

주소를 통해 값을 넘길 때 사용한다.
주로 id등 꼭 넣어주어야 하는 parameter는 Path parameter로 만드는 경우가 많다.
구현
//http://localhost:8080/api/v1/get-api/variable1/1 @GetMapping(value = "/variable1/{variable}") public String getVariable1(@PathVariable String variable){ return variable; }
Java
복사

2-3. Query parameter

주소에 ?표 뒤로 전달하는 parameter이다.
있어도 되고 없어도 되는 parameter를 주로 Query parameters로 만드는 경우가 많다.
첫번째만 ?뒤로 연결하고 두번째 parameter부터는 &으로 연결한다.

2-3-1 기본 Query parameter 구현과 결과

//http://localhost:8080/api/v1/get-api/request1?name=YeonJae&email=70003738@gmail.com&organization=멋사 @GetMapping(value = "/request1") public String getRequestParam1( //RequestParam으로 3개의 값 받기 @RequestParam String name, @RequestParam String email, @RequestParam String organization){ return name+" "+email+" "+organization; }
Java
복사

2-3-2 Map을 활용한 Query parameter 구현과 결과

@GetMapping(value = "/request2") public String getVariable2(@RequestParam Map<String, String> param) { param.entrySet().forEach((map) -> { System.out.printf("key:%s value:%s\n", map.getKey(), map.getValue()); }); return "request2가 호출 완료 되었습니다"; }
Java
복사

2-3-3 DTO(Data Transfer Object)활용하기

DTO란? 다른 레이어 간의 데이터 교환에 활용된다. 간단하게 설명하자면 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체이다.
따라서 DTO는 데이터를 교환하는 용도로만 사용하는 객체이기 때문에 별도의 로직이 포함되지 않는다.
비슷한 것으로 VO(Value Object)가 있는데 VO는 데이터 그 자체로 의미가 있는 객체를 의마한다. 가장 특징적인 부분은 읽기전용으로 설계하여 값을 변경할 수 없게 만들어 데이터의 신뢰성을 유지한다.
[MemberDto.java]
package com.example.hello.domain.dto; public class MemberDto { private String name; private String email; private String organization; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getOrganization() { return organization; } public void setOrganization(String organization) { this.organization = organization; } @Override public String toString() { return "MemberDto{" + "name='" + name + '\''+", email='" + email+ '\'' + ", organization='" + organization + '\''+'}'; } }
Java
복사
getter/setter 메서드를 구현했지만 setter는 현재 잘 사용하지 않는 추세이다.
[HelloController.java]
@GetMapping(value = "/request3") public String getVariable3(MemberDto memberDto) { return memberDto.toString(); }
Java
복사

2-4. POST API 만들기

http method에는 get, post, delete, put등 여러가지 종류가 있다.
이전까지 사용했던 GET API에서는 URL의 경로나 파라미터에 변수를 넣어 요청을 보냈지만 POST API에서는 저장하고자 하는 리소스나 값을 HTTP 바디에 담아서 서버에 전달한다.
GET과 Post 차이 - 가장 큰 차이점은 HTTP 요청을 할 때 파라미터를 path나 쿼리 파라미터를 쓰지 않고 Request >Body에 보낸다. - 주로 회원 가입 등 Http전송 중 노출되면 안되는 정보를 보낼 때 Post를 사용한다. - GET은 조회 할 때 사용한다. - POST는 주로 Insert할 때 사용 한다.

2-4-1 @RequestMapping으로 구현하기

[POSTController.java]
package com.example.hello.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/v1/post-api") public class POSTController { @RequestMapping(value = "/domain", method = RequestMethod.POST) public String postExample() { return "Hello Post API"; } }
Java
복사
POST 요청에서는 위 그림처럼 HTTP Body에 값을 넣어 전송한다. Body 영역에 작성되는 값은 일정한 형태를 취하는데 일반적으로 JSON형식으로 전송된다.
위의 코드에선 들어온 요청을 처리하는 부분이 없어서 Hello Post API만 출력되고 있다.
JSON? JavaScript Object Notation 의 약자로 Java에 Class가 있다면 JavaScript에는 JSON이 있다. 위 그림을 보면 java의 map처럼 쌍을 이루어 선언하여 사용된다.

2-4-2 @RequestBody를 활용한 POST메서드 구현

POST에서는 @RequestBody를 주로 사용한다. json(등)형식으로 들어온 데이터를 사용할 수 있게 해준다.
@RequestBody Map<String, Object> postData? - 아래 Json코드와 같이 어떤 타입으로 데이터가 들어올지 Sever입장에서는 예측할 수 없기 때문에 Value를 Object로 처리한다. - Object는 모든 자바 Class의 최상위 Class로 무엇이든 올 수 있다.
{ "name":"YeonJae", "email":"70003738@naver.com", "age":27 }
JavaScript
복사

2-4-2-1 Map을 이용해서 POST 구현

@PostMapping("/member") public String postMember(@RequestBody Map<String, Object> postData){ StringBuilder sb = new StringBuilder(); postData.entrySet().forEach(map -> { sb.append(map.getKey()+" : " + map.getValue()+"\n"); }); return sb.toString(); }
Java
복사

2-4-2-2 MemberDto를 이용해서 POST 구현

@PostMapping("/member2") public String postMember2(@RequestBody MemberDto memberDto){ return memberDto.toString(); }
Java
복사

2-5. PUT API 만들기

POST와 비슷하지만 주로 Update하는데 사용한다.
POST와 마찬가지로 @RequestBody를 이용한다.

2-5-1 @ResponseEntity를 활용한 PUT 메서드 구현

@ResponseEntity는 get, post, put, delete, patch 다른 메소드 에도 다 쓸 수 있다.
Http Response Header와 Body를 구성하기 쉽게 해준다.
@PUTMapping("/member3") public ResponseEntity<MemberDto> putMember(@RequestBody MemberDto memberDto) { return ResponseEntity .status(HttpStatus.ACCEPTED) .body(memberDto); }
Java
복사
POST방식과는 다르게 response형식이 application/json형이다.(POST는 text/plain형식이였음)

2-6. Swagger 추가하기

Swagger? 일종의 API 문서 자동 생성기이다.
사용 방법은 다음과 같다.
1) 의존성 추가
아래 내용을 porm.xml에 추가한다.
// swagger dependency implementation "io.springfox:springfox-boot-starter:3.0.0" implementation "io.springfox:springfox-swagger-ui:3.0.0"
Java
복사
2) Configuration 클래스 추가
아래 내용을 SwaggerConfig.java에 추가한다.(java파일 위치 조심할것)
@Configuration public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.OAS_30) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build(); } }
Java
복사
에러 나는 경우 - application.properties를 application.yml로 이름을 변경하고 application.yml에 아래와 같이 추가
spring: mvc: pathmatch: matching-strategy: ant_path_matcher
Plain Text
복사
Swagger를 들어가 보면 현재 생성된 Controller들을 확인할 수 있다.