240216 TIL #323 Spring @ 복습

김춘복·2024년 2월 15일
0

TIL : Today I Learned

목록 보기
323/494

Today I Learned

Spring Boot 로 진행될 과제 전형을 대비하기 위해 간만에 안드로이드를 접고 스프링부트 복습을 했다.


Spring 애너테이션 정리

Entity

: 테이블과 비슷하지만 다른 개념. 테이블은 DB나 SQL에 실존하지만 Entity는 속성(attribute)의 집합으로 물리적인 개념이 아닌 논리적인 개념이다.

  • private로 필드(테이블의 칼럼) 선언.
    생성자 필요

클래스 위에 붙는 @

  • @Getter : 게터 자동 생성
    @Setter : 세터 자동 생성
    @Entity : entity 선언
    @Entity(name = "orders") : name의 테이블이 생성된다.
    @NoArgsConstructor : 파라미터 없는 기본생성자 생성
    @AllArgsContstructor : 모든 필드값을 파라미터로 받는 생성자 만듬
    @RequiredArgsConstructor : final이나 not null인 필드값만 파라미터로 받는 생성자 만듬

클래스 안에 붙는 @

  • @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로 받음 .

Repository

: 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에서 필요한 메서드를 만들어서 위처럼 활용할 수도 있다.


Controller

: MVC에서 C. 입구이자 출구. Client의 Request를 받아 Service에 넘겨 처리한 후 View에 Model 객체를 적용해 Client에게 Response를 보낸다.

  • 메서드에 활용 할 변수들은
    private final 혹은 private static으로 선언 해두고
    생성자 생성(autowired 사용 가능)

클래스 위에 붙는 @

@Controller : 해당클래스를 컨트롤러로 선언
@RequestMapping("/이름") : 클래스 안의 모든 url의 제일 앞에 /이름 이 적용된다.(충돌회피용)
@RestController : @ResponsBody를 사용하지 않아도 html형식이나 json형식을 반환.

클래스 안에 메서드위에 쓰는 @

@ResponsBody : View페이지가 아니라 객체를 반환값 그대로(json같은) 클라이언트에게 return할 때 사용
@GetMapping("/여기") : /여기 에 요청이 오면 아래의 메서드를 실행

  • @Autowired : 일단 생성자에서 사용. 아래에 정리해둠

Controller - Request / 메서드 안에 파라미터 앞에 쓰는 @

  • @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객체의 필드값이 다 일치해야만 받아올 수 있다.


Service

: Client의 Request를 Controller에게 받아서 실질적으로 처리하는 비즈니스 로직을 담당.
DB의 데이터가 필요할 때는 Repository에 요청한다.

  • 필요한 변수 private final로 선언.
    비즈니스 로직 메서드로 생성 인터페이스 위에 하나 만들고 다른서비스는 상속받아 구현하는게 좋다.

클래스 위에 붙는 @

@Service : 클래스에 서비스를 선언.
@RequiredArgsConstructor 류 사용 가능
@Primary : 인터페이스아래에 구현체가 여러개면 중복이슈가 발생가능. primary를 선언하면 메인으로 등록가능
@Qualifier("이름") : 중복이 된 클래스 위에 달고 원하는 객체안에 다시 저걸 달면 중복 에러 회피 가능.


메인메서드가 있는 Application

@SpringBootApplication : 클래스 위에 달면 Spring에서 디폴트 설정을 알아서 해준다.
메인메서드 안에 아래를 적고 실행하면 강제로 서버를 끄지 않는 이상 계속 실행되어 request를 받는다.
SpringApplication.run(SpringIocDiInitApplication.class, args);

  • @EnableJpaAuditing : 이걸 해둬야 timestamp에 @EntityListeners(AuditingEntityListener.class 넣어서 쓸 수 있다.
profile
꾸준히 성장하기 위해 매일 log를 남깁니다!

0개의 댓글