#12 Spring 입문주차 <2주차>
url 보면
GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95
? 부터는 requestParam 방식으로 쿼리 스트링 시작이다
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
에서 @RequestParam 생략 가능!
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam(required = false) String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
(required = false) : name에 해당하는 값이 들어오지 않아도 에러가 나지 않고 null로 초기화된다
@ModelAttribute 바디 부분에 들어온 쿼리 스트링 방식의 데이터를 객체에 매핑해서 가져올 수 있다
@ModelAttribute도 생략 가능
ResponseBody와 RequestBody!!
https://dev-coco.tistory.com/95
문제)
STUDENT 테이블에서 s1 수강생을 삭제했을 때 EXAM에 있는 s1수강생의 시험성적과 MANAGER의 managerA가 관리하는 수강생 목록에 자동으로 삭제될 수 있도록 하세요.
- ALTER, DROP, MODIFY, CASCADE 를 사용하여 EXAM, MANAGER 테이블을 수정합니다.
답)
ALTER TABLE EXAM DROP CONSTRAINT exam_fk_student_code;
ALTER TABLE EXAM ADD CONSTRAINT exam_fk_student_code FOREIGN KEY(student_code) REFERENCES STUDENT(student_code) ON DELETE CASCADE;
ALTER TABLE MANAGER DROP CONSTRAINT manager_fk_student_code;
ALTER TABLE MANAGER ADD CONSTRAINT manager_fk_student_code FOREIGN KEY(student_code) REFERENCES STUDENT(student_code) ON DELETE CASCADE;
DELETE FROM STUDENT WHERE student_code = 's1';
-->기존의 exam_fk_student_code 라는 이름의 제약조건을 삭제하고
STUDENT 테이블의 데이터가 사라지면 STUDENT 테이블을 참조하고 있는 EXAM 테이블의 데이터 또한 삭제 될 수
있도록 연쇄 삭제가 일어나는 ON DELETE CASCADE 가 포함된 exam_fk_student_code 제약 조건을 다시 생성해준다
3번째 줄부터 같은 내용..
주입하기
private final MemoRepository memoRepository;
public void setDi(MemoRepository memoRepository){
this.memoRepository=memoRepository;
}
--> 에러, final 이 달린 변수는 바로 초기화 하거나 생성자를 통해서 초기화 해야한다
private MemoRepository memoRepository;
주입이 안될땐 @Autowired를 달아주자
필드 위에 달아주면 private이라해도 bean 객체를 외부에서 주입해 줄 수 있음
근데 추천하지 않음
@RequiredArgsConstructor 사용하면 필드는 final을 달아줘야 주입이 됨!!
Spring 'Bean' 사용 방법
스프링 IoC 컨테이너에서 ‘Bean’을 수동으로 가져오는 방법
ApplicationContext
@Component
public class MemoService {
private final MemoRepository memoRepository;
public MemoService(ApplicationContext context) {
// 1.'Bean' 이름으로 가져오기
MemoRepository memoRepository = (MemoRepository) context.getBean("memoRepository");
// 2.'Bean' 클래스 형식으로 가져오기
// MemoRepository memoRepository = context.getBean(MemoRepository.class);
this.memoRepository = memoRepository;
}
...
}