Spring Boot 로 진행될 과제 전형을 대비하기 위해 간만에 안드로이드를 접고 스프링부트 복습을 했다.
: 테이블과 비슷하지만 다른 개념. 테이블은 DB나 SQL에 실존하지만 Entity는 속성(attribute)의 집합으로 물리적인 개념이 아닌 논리적인 개념이다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
기본키 자동 생성
@Column(nullable = false) : null값 안되게 설정
@ManyToOne, @OneToMany, @OneToOne, @ManyToMany
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
다른 테이블(member)에서 컬럼(id) 가져와서 조인함 (FK랑 비슷)
@OneToMany(mappedBy = "member", fetch = FetchType.EAGER)
private List<Orders\> orders = new ArrayList<>();
위의 연관관계의 주인을 mappedBy = "member"로 맞춰줌. many로 받으니까 ArrayList로 받음 .
: Entity에 의해 생성된 DB에 접근하는 메서드들을 사용하기 위한 Interface.
DB 연결, 해제, 자원관리, CRUD작업 처리.
인터페이스로 작성. extends JpaRepository<Entity, id의 타입>
id타입은 보통 Long
Spring Data JPA 사용시 @Repository 안붙임
Repository를 인스턴스화 하면 아래와 같은 메서드를 쓸 수 있다.
.save() : 하나의 객체만 저장할 때 사용.
.saveAll() : 리스트형식처럼 되어있는걸 한번에 저장할 때 사용
.findAll : 전제 조회
.count() : 전체 '개수' 조회
.delete() : 삭제
@Query: JPQL이나 네이티브 SQL 쿼리를 직접 지정하여 메서드를 구현할 때 사용
@Param: @Query로 정의된 쿼리 메서드의 매개변수를 지정할 때 사용
@Lock: DB 락을 설정하여 메서드 수준에서 동시성 제어를 할 수 있음
그리고 Repository에서 필요한 메서드를 만들어서 위처럼 활용할 수도 있다.
: MVC에서 C. 입구이자 출구. Client의 Request를 받아 Service에 넘겨 처리한 후 View에 Model 객체를 적용해 Client에게 Response를 보낸다.
@Controller : 해당클래스를 컨트롤러로 선언
@RequestMapping("/이름") : 클래스 안의 모든 url의 제일 앞에 /이름 이 적용된다.(충돌회피용)
@RestController : @ResponsBody를 사용하지 않아도 html형식이나 json형식을 반환.
@ResponsBody : View페이지가 아니라 객체를 반환값 그대로(json같은) 클라이언트에게 return할 때 사용
@GetMapping("/여기") : /여기 에 요청이 오면 아래의 메서드를 실행
@PathVariable : @GetMapping("/star/{name}/age/{age}") 로 들어오면 {}부분을 변수로 받아준다.
@RequestParam : 쿼리스트링(주소뒤에 ? &가 붙음) 에서 변수를 매칭. 변수 하나하나 달아줘야한다.
get일때는 주소에 정보가 드러나고 post일때는 body안에 숨겨져 정보가 들어온다.
@ModelAttribute : 생략가능. param에서 변수하나하나 다는 것과 달리 객체형식으로 한번에 받는다.
이 방식을 쓰려면 해당 클래스에 @Setter를 달아줘야 한다. post로 body안에 쿼리스트링으로 정보가 들어온다.
@RequestBody : 위의 두 방식은 쿼리스트링으로 넘어가는데 이 방식은 JSON로 값이 넘어온다.
Header에는 Content type:application/json Body에는 JSON{딕셔너리형태}로 정보가 온다.
JSON 형식으로 넘어오는 값들은 @RequestBody를 달고 그 값들을 받아오는 객체를 명시하면 원하는 값을 받아올 수 있다.
단 클라이언트가 보낸 JSON의 필드 값과 서버 Entity객체의 필드값이 다 일치해야만 받아올 수 있다.
: Client의 Request를 Controller에게 받아서 실질적으로 처리하는 비즈니스 로직을 담당.
DB의 데이터가 필요할 때는 Repository에 요청한다.
@Service : 클래스에 서비스를 선언.
@RequiredArgsConstructor 류 사용 가능
@Primary : 인터페이스아래에 구현체가 여러개면 중복이슈가 발생가능. primary를 선언하면 메인으로 등록가능
@Qualifier("이름") : 중복이 된 클래스 위에 달고 원하는 객체안에 다시 저걸 달면 중복 에러 회피 가능.
@SpringBootApplication : 클래스 위에 달면 Spring에서 디폴트 설정을 알아서 해준다.
메인메서드 안에 아래를 적고 실행하면 강제로 서버를 끄지 않는 이상 계속 실행되어 request를 받는다.
SpringApplication.run(SpringIocDiInitApplication.class, args);