[신세계I&C KDT][Spring Boot] #44 REST API #1 (0625)

박현아·2024년 7월 1일
0

신세계아이앤씨 KDT

목록 보기
48/56

1. REST

  • Representational State Transfer (표현 상태 전송)
  • 웹 어플리케이션 개발 방법론 중의 하나로서 클라이언트와 서버간의 상태 정보를 표현하는 방식을 의미
    (어제까지의 개발 방법론이 SOAP - Simple Object Access Protocol 임)

1) SOAP 아키텍쳐

클라이언트 		---------------->   서버 (JSP/Thymeleaf 등)
(퉵브라우저)		<---------------
					응답 (html)

2) REST 아키텍쳐

  • JSON 통신 (XML은 요즘 잘 안 쓴다)
					 요청 (JSON/ XML)
클라이언트 (?)	-------------------------> 서버
- 웹브라우저		<-------------------------
- TV				 응답 (JSON/ XML)
- 자동차 등 

ex) @ResponseBody, @RequestBody
(이전에 일부분 JSON으로 넘겨줄 때 메서드 마다 썼었음)

@RestController
= @Controller + @ResponseBody

2. REST 디자인 가이드

https://library.gabia.com/contents/8339/

3. REST 표현

1) 데이터는 URI에 포함되어 전달된다

2) 클라이언트 요청 방식

  • 이전 SOAP 방식
    GET : select할 때 (조회)
    POST : 생성/수정/삭제 (구분을 주기 위해 url 이름을 다르게 줬음. addMember, getMember)
  • REST 방식
    GET : select할 때 (조회)
    POST : 생성
    PUT : 수정
    DELETE : 삭제
    (url은 똑같을 수 있음)

기본적으로 form을 사용하는 html에서는 GET/POST 방식만 지원된다 (< form method="post")
-> 도구가 필요함 (curl, postman, 크롬브라우저의 플로그인 Talend Test API)

4. REST 실습

1) 의존성

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
</dependency>

2) application.properties

#application.properties
logging.level.com.exam=info
logging.level.org.springframework=info

# tomcat port 번호 변경
server.port=8090

# context명 변경
server.servlet.context-path=/app

3) UserDTO.java 작성

  • lombok 라이브러리

(1) pom.xml 의존성 등록

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
		 <groupId>org.projectlombok</groupId>
		 <artifactId>lombok</artifactId>
</dependency>

(2) 현재 사용 중인 sts (eclipse)에 lombok 설정

https://projectlombok.org/download 에서 lombok.jar 다운 받기
cd C:\Users\ssginc72 가서 lombok.jar 파일 실행하기
java -jar lombok.jar
specify location에서SpringToolSuite4.exe 선택하기 (현재 쓰는 파일)

sts에 lombok.jar 가 생긴다
maven update 하고 재시작하기

(3) DTO 위에 @Data 쓰기 !!

-> 직접 생성해야됐던 getters, setters 등을 생성할 필요가 없어짐

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDTO {
	
	String username;
	int age;
	String address;
}
@GetMapping("/users")
	public UserDTO showUsers() {
		
		UserDTO dto = new UserDTO();
		String username = dto.getUsername();
		int age = dto.getAge();
		dto.setUsername("홍길동");
		dto.setAge(20);
		dto.setAddress("인천");
		logger.info("logger:UserDTO:{}", dto);
		
		return dto; // @RestController로 설정하면 return 되는 String이 뷰정보가 아니고 데이터임
	}

talend에서 http://localhost:8090/app/users 요청

Logger logger = LoggerFactory.getLogger(getClass()); 이거 대신
@Slf4j // 로그를 출력하고자 하는 클래스에 써주기

5. REST + MySQL + MyBatis 연동

1) 의존성 설정

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
		    <groupId>org.projectlombok</groupId>
		    <artifactId>lombok</artifactId>
</dependency>
<dependency>
		    <groupId>org.mybatis.spring.boot</groupId>
		    <artifactId>mybatis-spring-boot-starter</artifactId>
		    <version>2.1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
		    <groupId>mysql</groupId>
		    <artifactId>mysql-connector-java</artifactId>
		    <version>8.0.33</version>
</dependency>

2) application.properties

  • DB 연동위한 4가지 정보 설정
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/testdb
    spring.datasource.username=root
    spring.datasource.password=1234
  • 별칭
    mybatis.type-aliases-package=com.exam.dto

  • mapper 등록
    mybatis.mapper-locations=com/exam/mapper/*Mapper.xml

3) 테이블 생성

 use testdb;

	create table person (
	     id int primary key,
	     username varchar(20) not null,
	     birthdate  date 
	);

	insert into person (id, username, birthdate ) values ( 10, '홍길동', current_date() );
	insert into person (id, username, birthdate ) values ( 20, '이순신', current_date() );
	insert into person (id, username, birthdate ) values ( 30, '유관순', current_date() );

	commit;

4) PersonDTO.java (lombok 사용)

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
@Alias("PersonDTO")
public class PersonDTO {

	int id;
	String username;
	LocalDate birthdate;
}

5) PersonMapper.xml과 PersonMapper.java

<mapper namespace="com.exam.mapper.PersonMapper">

	<select id="findAll" resultType="PersonDTO" >
		select id, username, birthdate
		from person
		order by id desc
	</select>
</mapper>
@Mapper
public interface PersonMapper {

	public List<PersonDTO> findAll();
}

6) PersonService.java, PersonServiceImpl.java

public interface PersonService {
	
	public List<PersonDTO> findAll();

}
@Service
public class PersonServiceImpl implements PersonService {

	PersonMapper personMapper;
	
	public PersonServiceImpl(PersonMapper personMapper) {
		this.personMapper = personMapper;
	}

	@Override
	public List<PersonDTO> findAll() {
		return personMapper.findAll();
	}

}

7) PersonController.java

@RestController
@Slf4j
public class PersonController {
	
	PersonService personService;

	public PersonController(PersonService personService) {
		this.personService = personService;
	}

	@GetMapping("/persons") // 요청맵핑값은 REST API 가이드 문서를 참고하자
	public List<PersonDTO> findAll() {
		
		List<PersonDTO> list  = personService.findAll();
		log.info("logger:findAll:{}", list);
		return list;
	}
	
}

6. 파라미터 전달

예> GET http://localhost:8090/app/persons/10/서울
GET http://localhost:8090/app/persons/20/부산

==> @GetMapping("/persons/{변수}/{변수}")
@PathVariable("변수1") String id, @PathVariable("변수2") String address

예> GET http://localhost:8090/app/persons/10/address/서울
GET http://localhost:8090/app/persons/20/address/부산
==> @GetMapping("/persons/{변수}/address/{변수}")
@PathVariable("변수1") String id, @PathVariable("변수2") String address

7. 데이터 저장 (POST / PUT)

-> security 관련해서는 csrf 이슈가 있음. 비활성화 필요 !

  • POST 방식
  • 전달되는 데이터는 JSON 형식
  • header에 전달되는 타입을 지정해준다
    Content-Type: application/json (반더시)
    {		
    	  "id" : 10
    	  "username":"유관순2",    
    	  "birthdate":"2024-12-25" ===> PersonDTO에 저장. @ResponseBody 쓰기
    }
    
- LocalDate 사용하는 경우에는 날짜 포맷 설정 필요
    
- applicationo.properties에 LocalDate 날짜 포맷 지정
spring.mvc.format.date=yyyy-MM-dd

LocalDate 날짜 포맷 지정
spring.mvc.format.date=yyyy-MM-dd

 
 get은 url을 통해서 넘어가고
 post는 body를 통해서 넘어간다
 
##  8. 데이터 수정
 - PUT 방식
 - JSON + @PathVariable(where절에서 사용) 같이 사용 가능

{
"username":"유관순2",
"birthdate":"2024-12-25" ===> @RequestBody와 @PathVariable 같이 사용 가능
}

 - header에 전달되는 타입을 지정해야된다 
  Content-Type: application/json
 - POST랑 PUT은 Content-Type: application/json 지정해줘야됨
 
## 9. 데이터 삭제
- DELETE 방식
- @PathVariable 사용해서 삭제하고자 하는 값을 전달


0개의 댓글