BootCamp 46day

GyeongNam·2024년 1월 20일
0

BootCamp

목록 보기
40/49
post-thumbnail

📅 2024년 01월 18일


46일차 : Spring (6)

영속성컨텍스트

객체의 상태를 데이터베이스에 저장하거나 로드하는데 사용되며, "임시 저장"과는 다소 관련이 있을 수 있다

1. 객체 상태 관리:
영속성 컨텍스트는 애플리케이션의 실행 동안 객체의 상태를 추적하고 관리한다. 이 객체는 데이터베이스에 저장되었을 수도 있고, 현재 메모리에만 존재할 수도 있다.

2. 트랜잭션 관리:
영속성 컨텍스트는 트랜잭션을 관리하며, 트랜잭션이 커밋될 때 객체 상태를 데이터베이스에 동기화한다.

3. 지연 로딩 및 즉시 로딩:
영속성 컨텍스트는 필요할 때까지 데이터를 로드하지 않고 지연 로딩을 허용하거나, 즉시 로딩을 통해 데이터를 즉시 로드하는 기능을 제공한다.

4. 캐싱:
영속성 컨텍스트는 데이터베이스에서 읽어온 객체를 캐시하여 성능을 향상시킬 수 있다. 따라서 동일한 객체를 여러 번 불러오는 것을 피할 수 있다.

5. Dirty Checking:
영속성 컨텍스트는 객체의 상태 변경을 추적하고, 변경된 객체만을 데이터베이스에 업데이트하는데 사용됩. 이를 Dirty Checking이라고 한다.

의존성 주입

@Autowired

@Autowired를 사용하면 스프링 컨테이너는 해당 클래스를 빈으로 등록할 때, 
필드나 메서드의 매개변수에 해당하는 빈을 자동으로 찾아서 주입한다.
주입 방식설명
생성자 주입(Constructor Injection)객체 생성 시 생성자를 통해 의존성을 주입하는 방식입니다.
메서드 주입(Method Injection)메서드 호출 시 의존성을 주입하는 방식입니다.
셋터 주입(Setter Injection)Setter 메서드를 통해 의존성을 주입하는 방식입니다.
Lombok의 @RequiredArgsConstructorLombok이 제공하는 어노테이션으로, 클래스의 final 필드에 대한 생성자를 자동으로 생성합니다.

생성자 주입(Constructor Injection)

public class ConstructorInjectionExample {
    private final Dependency dependency;
    @Autowired
    public ConstructorInjectionExample(Dependency dependency) {
        this.dependency = dependency;
    }
    // ... 클래스의 나머지 부분 ...
}

메서드 주입(Method Injection)

public class MethodInjectionExample {
    private Dependency dependency;
    @Autowired
    public void injectDependency(Dependency dependency) {
        this.dependency = dependency;
    }
    // ... 클래스의 나머지 부분 ...
}

셋터 주입(Setter Injection)

public class SetterInjectionExample {
    private Dependency dependency;
    @Autowired
    public void setDependency(Dependency dependency) {
        this.dependency = dependency;
    }
    // ... 클래스의 나머지 부분 ...
}

@RequiredArgsConstructor

@RequiredArgsConstructor
public class LombokRequiredArgsConstructorExample {
    private final Dependency dependency;
    // ... 클래스의 나머지 부분 ...
}

주입 방식은 프로그래밍 언어 및 프레임워크에 따라 다를 수 있으며, 선택하는 것은 주로 개발자의 선호도, 코드 가독성, 유지보수성 등을 고려하여 결정된다.

@Component 와 @Bean

스프링 프레임워크에서 빈(Bean)을 등록하고 관리하기 위한 어노테이션으로
일반적으로 @Component는 클래스 단위로 사용되고, @Bean은 메서드 단위로 사용한다.

역할@Component@Bean
용도클래스를 스프링의 컴포넌트로 지정메서드를 통해 개발자가 직접 빈을 정의
위치클래스 레벨메서드 레벨
등록 방법자동 스캔 (@ComponentScan 사용)개발자가 직접 Java 설정 클래스에 정의
생성 방식자바 클래스의 인스턴스개발자가 직접 빈을 생성하여 반환
확장 어노테이션@Controller, @Service, @Repository없음
주로 사용되는 위치비즈니스 로직, 서비스 계층, 리포지토리 등Java Config 클래스에서 빈을 정의하는 용도
자동 관리 여부스프링 컨테이너가 자동으로 관리스프링 컨테이너가 자동으로 관리되거나 수동으로 선택 가능

Spring MVC

Spring MVC(모델-뷰-컨트롤러)는 스프링 프레임워크의 웹 애플리케이션 개발을 위한 모듈
웹 어플리케이션의 구조를 간단하게 유지하고 개발을 용이하게 만들어주는 프레임워크이다.

  • 모델(Model):
    모델은 애플리케이션의 비즈니스 로직 및 데이터를 나타낸다. Java 객체로 표현되며, 화면에 표시될 데이터나 데이터의 처리 로직을 포함한다.
  • 뷰(View):
    뷰는 사용자에게 보여지는 부분으로, 모델의 정보를 기반으로 화면을 생성. 주로 JSP, Thymeleaf, FreeMarker 등의 템플릿 엔진을 사용하여 구현.
  • 컨트롤러(Controller):
    컨트롤러는 사용자의 입력을 처리하고, 모델과 뷰 사이의 상호 작용을 관리한다. 클라이언트의 요청을 받아 해당 요청을 처리하고, 결과를 모델에 반영하고, 적절한 뷰를 선택하여 클라이언트에게 반환한다.

Spring MVC의 특징과 동작:

  1. 컨트롤러 매핑:
    URL 패턴에 따라 어떤 컨트롤러가 요청을 처리할지를 결정하는 매핑을 정의.

  2. HTTP 요청 메서드 매핑:
    각각의 컨트롤러 메서드가 어떤 HTTP 요청 메서드(GET, POST, 등)에 응답할지를 지정.

  3. 데이터 바인딩 및 검증:
    사용자 입력 데이터를 모델 객체에 바인딩하고, 데이터 유효성 검증을 수행할 수 있는 기능을 제공.

  4. 뷰 리졸버(View Resolver):
    뷰의 논리적 이름을 실제 뷰로 매핑해주는 역할.

  5. 인터셉터(Interceptors):
    컨트롤러 실행 전, 후에 추가적인 작업을 수행할 수 있도록 하는 기능을 제공.

  6. 파일 업로드 처리:
    파일 업로드를 간편하게 처리할 수 있는 기능을 제공.

RESTful API

  • MemberRestController.java
@Controller
@RestController
@RequestMapping("/rest")
public class MemberRestController {
    private final MemberService memberService;
    @Autowired
    public MemberRestController(MemberService memberService){
        this.memberService = memberService;
    }
    @PostMapping("/member/create")
    public String MemberAdd(@RequestBody MemberRequestDTO memberRequestDTO){
        memberService.save(memberRequestDTO);
        return "ok";
    }
    @GetMapping("/members")
    public List<MemberResponseDTO> getMembers() {
        return memberService.findAll();
    }
    @GetMapping("/member/find/{id}")
    public ResponseEntity<Map<String, Object>> getMemberDetail(@PathVariable long id){
        MemberResponseDTO memberResponseDTO = null;
        try{
            memberResponseDTO = memberService.findById(id);
            return ResponseEntityController.responseMassage(HttpStatus.OK,memberResponseDTO);
        }catch (Exception e){
            return ResponseEntityController.responseErrorMassage(HttpStatus.NOT_FOUND, e.getMessage());
        }
    }
    @PatchMapping("/member/update")
    public MemberResponseDTO MemberUpdate(@RequestBody MemberRequestDTO memberRequestDTO){
        memberService.update(memberRequestDTO);
        return memberService.findById(memberRequestDTO.getId());
    }
    @DeleteMapping("/member/delete/{id}")
    public String getMemberDelete(@PathVariable long id){
        memberService.delete(id);
        return "ok";
    }
}
HTTP 메서드설명사용 용도
GET서버로부터 정보를 요청한다.데이터 조회하고, 리소스를 얻는 데 사용한다.
POST서버에 새로운 데이터를 제출한다.리소스를 생성하거나 데이터를 전송할 때 사용한다.
PUT클라이언트에서 서버로 데이터를 전송하여 리소스를 업데이트한다.리소스를 전체 갱신할 때 사용한다.
PATCH클라이언트에서 서버로 일부 데이터를 전송하여 리소스를 업데이트한다.리소스를 일부 갱신하거나 부분 업데이트할 때 사용한다.
DELETE서버에 있는 리소스를 삭제한다.리소스를 삭제할 때 사용한다.
  • ResponseEntityController.java
@RestController
@RequestMapping("/response/entity")
public class ResponseEntityController {
    @GetMapping("response-status")
    @ResponseStatus(HttpStatus.CREATED)
    public String responseStatus(){
        return "ok";
    }
    @ResponseStatus(HttpStatus.CREATED)
    public Member responseStatus2(){
        Member member = new Member("김선국","123","124");
        return member;
    }
    // ResponseEntity 를 직접 생성하는 방법
    public ResponseEntity<Member> responseStatus3(){
        Member member = new Member("김선국","123","124");
        return new ResponseEntity<>(member,HttpStatus.CREATED);
    }
    // ResponseEntity<String> 일 경우 text/html 로 설정
    public ResponseEntity<String> responseStatus4(){
        String html = "<h1>없는 ID입니다.</h1>";
        return new ResponseEntity<>(html,HttpStatus.NOT_FOUND);
    }
    // map 형태의 메시지 커스텀
    public static ResponseEntity<Map<String, Object>> responseErrorMassage(HttpStatus status, String message){
        Map<String, Object> map = new HashMap<>();
        map.put("status", Integer.toString(status.value()));
        map.put("status message", status.getReasonPhrase());
        map.put("error message", message);
        return new ResponseEntity<>(map, status);
    }
    public static ResponseEntity<Map<String, Object>> responseMassage(HttpStatus status, Object object){
        Map<String, Object> map = new HashMap<>();
        map.put("status", Integer.toString(status.value()));
        map.put("message", object);
        return new ResponseEntity<>(map, status);
    }
    /*
    메서드 채이닝 : ResponseEntity 의 클래스에서도 사용
     */
    @GetMapping("chaing1")
    public  ResponseEntity<Member> chaing1() {
        Member member = new Member("김선국","123","124");
        return ResponseEntity.ok(member);
    }
    @GetMapping("chaing2")
    public  ResponseEntity<String> chaing2() {
        return ResponseEntity.notFound().build();
    }
    @GetMapping("chaing3")
    public ResponseEntity<Member> chaing3() {
        Member member = new Member("김선국","123","124");
        return ResponseEntity.status(HttpStatus.CREATED).body(member);
    }
}

Spring 실습 github 링크

profile
503 Service Unavailable Error

0개의 댓글