클라이언트 ----------------> 서버 (JSP/Thymeleaf 등)
(퉵브라우저) <---------------
응답 (html)
요청 (JSON/ XML)
클라이언트 (?) -------------------------> 서버
- 웹브라우저 <-------------------------
- TV 응답 (JSON/ XML)
- 자동차 등
ex) @ResponseBody, @RequestBody
(이전에 일부분 JSON으로 넘겨줄 때 메서드 마다 썼었음)
@RestController
= @Controller + @ResponseBody
https://library.gabia.com/contents/8339/
기본적으로 form을 사용하는 html에서는 GET/POST 방식만 지원된다 (< form method="post")
-> 도구가 필요함 (curl, postman, 크롬브라우저의 플로그인 Talend Test API)
<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>
#application.properties
logging.level.com.exam=info
logging.level.org.springframework=info
# tomcat port 번호 변경
server.port=8090
# context명 변경
server.servlet.context-path=/app
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
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 하고 재시작하기
-> 직접 생성해야됐던 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 // 로그를 출력하고자 하는 클래스에 써주기
<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>
별칭
mybatis.type-aliases-package=com.exam.dto
mapper 등록
mybatis.mapper-locations=com/exam/mapper/*Mapper.xml
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;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
@Alias("PersonDTO")
public class PersonDTO {
int id;
String username;
LocalDate birthdate;
}
<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();
}
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();
}
}
@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;
}
}
REST는 기본적으로 데이터를 URI에 포함하여 전달한다
SOAP 방식
예> GET http://localhost:8090/app/persons?id=10
GET http://localhost:8090/app/persons/id=20
==> @GetMapping("/persons") // URL은 쿼리스트링 제외
@RequestParam("id") String id
REST 방식
예> GET http://localhost:8090/app/persons/10
GET http://localhost:8090/app/persons/20
==> @GetMapping("/persons/{변수}") // URL은 마지막 값까지 포함
@PathVariable("변수") String id
예> 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
-> security 관련해서는 csrf 이슈가 있음. 비활성화 필요 !
{
"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 사용해서 삭제하고자 하는 값을 전달