REST FULL Service REST 알아보기
의존성 주입 (Dependency Injection)
객체간의 의존성을 스프링 컨테이너가 자동으로 연결해 주는 것으로 개발자가 빈(bean) 설정 파일에
의존관게가 필요한 정보를 추가 해주면 스프링 컨테이너가 자동적으로 연결
객체를 직접 생성하지 않고 생성자나 메소드 인자로!
DI 관련 (Dependency Injection)
@Autowired : 속성, 생성자, setter 메서드, 일반 메서드 위에 선언 , spring에서 지원
@Resouce(name="빈 이름") : 속성, setter 메서드 위에 선언
@Inject : 속성, 생성자, setter 메서드, 일반 메서드 위에 선언, 자바에서 지원
REST FULL Service REST, REST API
-REST(Representational State Transfer)Representaional state Transfer)
- 자원 서비스 할 대상을 화면을 통해서 표시하던 것에서 자원에 대한 정보를 xml 또는 JSON 으로 표시
- URI 는 하나의 고유한 리소스를 대표하도록 설계
@RestController는 Spring Framework에서 제공하는 애노테이션으로, RESTful 웹 서비스를 만들기 위해 사용된다.
@Controller와 @ResponseBody 애노테이션을 결합한 형태로, 클래스의 모든 핸들러 메서드가 RESTful 웹 서비스의 엔드포인트로 동작하게된다.
메서드가 반환하는 객체를 자동으로 JSON 또는 XML 형태로 변환하여 HTTP 응답 본문으로 반환한다.
@PathVariable는 URL 경로의 변수 값을 메서드 파라미터로 전달하기 위해 사용한다.
dao(Data Access object)
데이터를 처리하는 객체
insert, delect, update,select 진행
테이블 당 1개
@Repository
service
사용자에서 서비스하는 단위로 개발
실제 서비스에 대한 기능을 넣어둠
트랜잭션처리
서비스 기능 처리
@Service
dto
데이터 단위에 하나
인자로 받는건 한번에 dto에 담아서
DB테이블의 ROW정보를 표시
컬럼 데이터가 -> 속성
table당 하나가 만들어짐
@Restcontroller : 생성해줘
@AutoWired : 생성한거 줘~ // 따로 안하고 생성자로 가능
클래스 내에 생성자가 한개 있으면 해당 생성자로 객체를 생성하면서 인자로 선언한 객체를 자동 주입한다.
=> 순환 참조의 위험이 생긴다
@PathVariable
@RequestParam // 하나줘
pagebean 여러개
1. web만 서비스
client(browser) | => request => <= response <= |
view => isp ,http ..... |
controler => | model service, dao ,dto |

2. View가 다변화 된 시대 (Web, android, ios, …..)

- 모델은 공유하지만 각각에 컨트롤러에 맞는 controller가 필요
3. REST – FUL Servic
client(browser) | ajax | json xml |
controler | model service, dao ,dto |

- 특정 ui를 위한 데이터가 아니라 전체를 위한 데이터를 JSON, xml 로 응답!
=> 요청하는 자료에 대해서 자료만 전달 하고 화면은 각각에서 알아서 만들게끔 제공
- client side rendering
- 브라우저가 UI 만드는 작업을 ‘모두’ 담당한다.
=> 화면 만들어 주는 react , vue, ...프레임 워크가 필요
- form data
예전에는 form data를 사용하여
get : search delect
post : insert, update ,put
get post 방식이 두가지 밖에 없어서 url로 구별 ex) /book / serarch , /book / serarchAll
예전 post, get (form style)
=> url로 요청 구별
book / search ? isbn=: ....
현재 cors 를 통해서 데이터정보를 json, xml 로 주고
Get select
post input
put update
delect delect
4가지 방식 활용
rest method로 요청을 구별 (quary style)
select get /book / pk : 1개 --상세정보
/book ? key = authroword =유레카 : 여러개 --목록정보
insert post /book
update put / book
delect delect /book /pk
@RestController
@RestController는 Spring Framework에서 제공하는 애노테이션으로, RESTful 웹 서비스를 만들기 위해 사용된다.
@Controller와 @ResponseBody 애노테이션을 결합한 형태로, 클래스의 모든 핸들러 메서드가
RESTful 웹 서비스의 엔드포인트로 동작하게된다.
메서드가 반환하는 객체를 자동으로 JSON 또는 XML 형태로 변환하여 HTTP 응답 본문으로 반환한다.
@PathVariable는 URL 경로의 변수 값을 메서드 파라미터로 전달하기 위해 사용한다.
@RestController
: RESTful 서비스를 위한 컨트롤러 - 모든 메서드의 응답에@ResponseBody를 자동으로 추가하는 효과
RestFul 서비스의 자원(Domain) 이름을 매핑
@RequestMapping("/요청명")
: 해당 URL 경로에 대한 요청을 처리
@CrossOrigin
: - CORS(Cross-Origin Resource Sharing) 요청에 대한 승인 설정
- origins = {"*"} : 모든 URL과 메서드를 승인
(주의: 보안상 취약점이 될 수 있으므로 실제 상용 환경에서는 사용을 지양)
(상용 환경에서는 Configuration을 통해 세부 설정을 진행할 예정)
@RestController
@RequestMapping("/test")
@CrossOrigin(origins = {"*"})
public class TestController {
private Logger logger = LoggerFactory.getLogger(getClass());
public TestController() {
logger.debug("TestController 생성됨.");
}
- get 요청
여러가지 방식 중 메소드 방식으로
@GetMapping
// GET 요청 시 Member 객체로 데이터를 읽어서 처리
public ResponseEntity<Member> hello(Member member) {
// 요청 데이터 출력
System.out.println("요청 데이터: " + member);
// ResponseEntity로 Member 객체를 반환
ResponseEntity<Member> response = new ResponseEntity<>(member, HttpStatus.OK);
return response;
}
- Get방식의 Form Data or Query String을 추출하는 방법
1. 요청 데이타 1개를 추출하기
@RequestParam(value='요청 데이타 명', required, defaultValaue) String or Primitive
value
- 추출할 요청 데이타 명을 지정
required
true : 요청 데이타가 없으면 error 발생 , default
false: 요청 데이타가 없어도 됨.
defaultValue
- 요청 데이타가 전달 되지 않는 경우 설정한 기본 값이 전달 된다.
2. 요청 데이타가 많은 경우
2.1 @RequestParam Map
- request packet에 있는 모든 요청 데이타를 추출해서 Map에 저장해서 전달 된다.
2.2 DTO ==> @ModelAttriute를 붙여도 되고 안붙여도 됨.
- 지정한 DTO의 객체를 생성하고
객체에 선언된 모든 속성에 대해서 - 속성 이름으로 요청데이타를 추출 후 setter 함수로 객체에 setting
- 메소드 방식이 둘다 get 이라면? pk를 path 지정 하여 사용
ResponseEntity
응답 데이타를 담을 객체
@PathVariable
요청 데이타가 url에 있는 경우 path에서 데이타를 전달 받을 때 사용하는 Annotation
Get 방식에서 범위 데이타를 요청할때와 pk를 이용한 1개의 데이타를 요청할때를
구별하기 path로 전달된 pk를 추출할때 사용한다.
형식]
@GetMapping("/{데이타명}")
public ResponseEntity 메서드명(@PathVariable("isbn")String isbn)
@GetMapping("/{isbn}")
// ISBN을 경로 변수로 받아 책을 검색하는 메서드
public ResponseEntity<Book> search(@PathVariable("isbn") String isbn) {
// 요청된 ISBN 값 로그로 출력
logger.debug("검색된 ISBN: {}", isbn);
// 서비스에서 ISBN을 사용해 책 정보 검색
Book book = service.search(isbn);
// 검색된 책 정보를 HTTP 응답으로 반환
return new ResponseEntity<>(book, HttpStatus.OK);
}
@RequestBody
요청 방식이 Put과 Post이면서요청 데이타가 JSON 형식일 때
전달되는 요청 packet의 body를 객체로 전달 받을 때 사용하는 Annotation
- insert post , update put
@PostMapping
// 새 책 등록
public ResponseEntity<String> regist(@RequestBody Book book) {
// 등록된 책 정보 로그로 출력
logger.debug("등록된 책: {}", book);
// 서비스에서 책 정보 삽입
service.insert(book);
// 성공 메시지와 함께 HTTP 201 Created 응답 반환
return new ResponseEntity<>(SUCCESS, HttpStatus.CREATED);
}
@PutMapping
// 기존 책 정보 수정
public ResponseEntity<String> update(@RequestBody Book book) {
// 수정된 책 정보 로그로 출력
logger.debug("수정된 책: {}", book);
// 서비스에서 책 정보 수정
service.update(book);
// 성공 메시지와 함께 HTTP 200 OK 응답 반환
return new ResponseEntity<>(SUCCESS, HttpStatus.OK);
}
- delete
@DeleteMapping("/{isbn}")
// 책 삭제
public ResponseEntity<String> remove(@PathVariable("isbn") String isbn) {
// 삭제할 책의 ISBN 로그로 출력
logger.debug("삭제할 책 ISBN: {}", isbn);
// 서비스에서 책 정보 삭제
service.remove(isbn);
// 성공 메시지와 함께 HTTP 200 OK 응답 반환
return new ResponseEntity<>(SUCCESS, HttpStatus.OK);
}
=> form path json 따라 처리 결과가 달라짐
-오류처리
@ExceptionHandler
해당 컨트롤러에서 발생하는 오류를 처리하는 Annotation
* Content-Type : application/json;charset-UTF-8
: error 메세지 처리시 한글인 경우 깨지므로 한글 처리를 해야한다.
@ExceptionHandler
// 예외 처리 핸들러
public ResponseEntity<String> handler(Exception e) {
// 예외 메시지를 로그로 출력
logger.error("오류 메시지: {}", e.getMessage());
// 응답 헤더 설정 (한글 인코딩 처리)
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json;charset=UTF-8");
// 오류 메시지와 함께 HTTP 500 Internal Server Error 응답 반환
return new ResponseEntity<>("처리 중 오류가 발생했습니다.", headers, HttpStatus.INTERNAL_SERVER_ERROR);
}
- 해당 에러를 한번에 처리!
@controllerAdvice
- project 에서 발생하는 모든 오류를 처리하는 기능
=> 일반 웹 방식은 처리를 해줘야 하지만
rest는 프론트에서 처리해주면 되기 때문에 공통처리로 @controllerAdvice 해주면 된다.