API(Presentation) Layer : @Controller
0. Spring 위임영역 : req를 controller까지 보내준 상태
1. Presentation(API) Layer @Controller : req를 처리해야 할 controller까지 찾아온 상태
2. Business(Service) Layer @Service : 실질적인 액션을 하는 단계
→ 컨트롤러와 서비스가 유사하게 느껴지지만, 컨트롤러는 좀 더 거시적인 관점에서 흐름제어(혹은 관문역할)를 하고, 서비스가 실질적인 비지니스 로직을 가지고 있음.
→ 객체지향 관점에서 계속 객체단위로 나뉜다고 생각
3. Persistant Layer @Repository : 물리DB와 통신하는 인터페이스 계층
Response는 반대로(3→2→1) 진행되며, req는 데이터가 파라미터로 전달되고, res는 return으로 데이터가 전달됨.
엔트리포인트(Entrypoint) 클래스 : 애플리케이션 시작점(main)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}}
@SpringBootApplication :
- @EnableAutoConfiguration : 자동구성 활성화
- @ComponentScan : 애플리케이션 패키지 내에서 @Component가 붙은 클래스를 검색후 Spring Bean으로 등록하는 기능 활성화
- @SpringBootConfiguration : Configuration이 붙은 클래스를 자동으로 찾아주고, Spring Bean을 등록하는 기능 활성화
SpringApplication.run(Application,class, args) : Spring 애플리케이션을 부트스트랩하고, 실행하는 역할
(부트스트랩 : 애플리케이션이 실행되기 전에 여러가지 설정 작업을 수행하여 실행 가능한 애플리케이션으로 만드는 단계)
Controller 구조
@RestController (안에 @Controller 붙어있음)
- REST API의 리소스를 처리하기 위한 API 앤트리포인트로 동작함을 정의
- 애플리케이션 로딩 시 Spring Bean으로 등록해줌
- Controller는 view까지 관여할때 사용
- 클래스 명은 ~Controller 로 함
- 핸들러 메서드를 매핑
- 클래스 전체에 사용되는 공통 URL 설정
- @RequestMapping(value = "/v1/members", produces ={MediaType.*APPLICATION_JSON_VALUE*})
- produces : 응답 데이터를 어떤 미디어 타입으로 클라이언트에게 전송할지 설정
- 설정하지 않으면 JSON타입이 아닌 문자열 자체를 전송
- → produces 부분은 제거하고, 각 메서드에서 ResponseEntity 타입으로 반환하면 됨
http주소 + HTTP Method 타입 까지 확인하기 때문에 URL이 같더라도 메서드 타입으로 다르면 가능함
1. CREATE @PostMapping
메서드 파라미터 :
@RequestBody 바디 전체를 가져옴(파싱 필요)
@RequestParam String phone : 키값 틀리면 조회 안됨
→ @RequestParam("phone") String phone2
→ @RequestParam Map<String, String> map : json 형태 그대로 key,value로 받을 수 있음
2. READ @GetMapping("/{member-id}")
메서드 파라미터
@PathVariable("member-id") long id : mapping에 사용한 변수명과 일치시켜야함
3. UPDATE @PutMapping , @PatchMapping
4. DELETE @DeleteMapping
5. 응답(Response) : Spring에서 웹응답에 특화된 라이브러리 제공 ResponseEntity
@RestController
@RequestMapping(value = "/v1/members")
//@RequestMapping(value = "/v1/members", produces ={MediaType.APPLICATION_JSON_VALUE})
public class MemberController {
private final Map<Long, Map<String, Object>> members = new HashMap<>();
// Create
@PostMapping
public ResponseEntity postMember(@RequestParam Map<String, String> reqParam){
System.out.println("email : "+reqParam.get("email"));
System.out.println("id : "+ reqParam.get("memberId"));
long newMemberId = Long.parseLong(reqParam.get("memberId"));
Map<String, Object> newMember = new HashMap<>(reqParam);
members.put(newMemberId, newMember);
return new ResponseEntity<>(members.get(newMemberId), HttpStatus.OK);
}
// Read
@GetMapping("/{member-id}")
public ResponseEntity getMember(@PathVariable("member-id") long id){
System.out.println("get member id : "+ id);
return new ResponseEntity(members.get(id), HttpStatus.OK);
}
// Update (Patch)
@PatchMapping("/{member-id}")
public ResponseEntity patchMember(
@PathVariable("member-id") long memberId,
@RequestParam String phone){
Map<String, Object> member = members.get(memberId);
if(member ==null) return new ResponseEntity(HttpStatus.NOT_FOUND);
else member.put("phone", phone);
return new ResponseEntity(member, HttpStatus.OK);
}
// Update (Put)
@PutMapping("/{member-id}")
public ResponseEntity updateMember(@PathVariable("member-id") long id, @RequestParam Map<String, String> reqParam){
System.out.println("update id : "+ id );
//Map<String, Object> member = members.get(id);
members.get(id).replace("phone",reqParam.get("phone"));
return new ResponseEntity(members.get(id), HttpStatus.OK);
}
// Delete
@DeleteMapping("/{member-id}")
public ResponseEntity deleteMember(@PathVariable("member-id") long memberId){
if(members.containsKey(memberId)) members.remove(memberId);
else return new ResponseEntity(HttpStatus.NOT_FOUND);
return new ResponseEntity(HttpStatus.NO_CONTENT);
}
'Coding > Back - Spring Framework' 카테고리의 다른 글
Spring Business(Service) Layer #Day6 (0) | 2023.08.23 |
---|---|
Spring DTO, Validation #Day5 (0) | 2023.08.22 |
Spring MVC (0) | 2023.08.21 |
Spring Servlet Filter, Interceptor, AOP #Day3 (0) | 2023.08.18 |
Spring IoC /DI #Day2 (0) | 2023.08.17 |