📅 2024년 01월 18일
객체의 상태를 데이터베이스에 저장하거나 로드하는데 사용되며, "임시 저장"과는 다소 관련이 있을 수 있다
1. 객체 상태 관리:
영속성 컨텍스트는 애플리케이션의 실행 동안 객체의 상태를 추적하고 관리한다. 이 객체는 데이터베이스에 저장되었을 수도 있고, 현재 메모리에만 존재할 수도 있다.2. 트랜잭션 관리:
영속성 컨텍스트는 트랜잭션을 관리하며, 트랜잭션이 커밋될 때 객체 상태를 데이터베이스에 동기화한다.3. 지연 로딩 및 즉시 로딩:
영속성 컨텍스트는 필요할 때까지 데이터를 로드하지 않고 지연 로딩을 허용하거나, 즉시 로딩을 통해 데이터를 즉시 로드하는 기능을 제공한다.4. 캐싱:
영속성 컨텍스트는 데이터베이스에서 읽어온 객체를 캐시하여 성능을 향상시킬 수 있다. 따라서 동일한 객체를 여러 번 불러오는 것을 피할 수 있다.5. Dirty Checking:
영속성 컨텍스트는 객체의 상태 변경을 추적하고, 변경된 객체만을 데이터베이스에 업데이트하는데 사용됩. 이를 Dirty Checking이라고 한다.
@Autowired
@Autowired를 사용하면 스프링 컨테이너는 해당 클래스를 빈으로 등록할 때, 필드나 메서드의 매개변수에 해당하는 빈을 자동으로 찾아서 주입한다.
주입 방식 설명 생성자 주입(Constructor Injection) 객체 생성 시 생성자를 통해 의존성을 주입하는 방식입니다. 메서드 주입(Method Injection) 메서드 호출 시 의존성을 주입하는 방식입니다. 셋터 주입(Setter Injection) Setter 메서드를 통해 의존성을 주입하는 방식입니다. Lombok의 @RequiredArgsConstructor Lombok이 제공하는 어노테이션으로, 클래스의 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(모델-뷰-컨트롤러)는 스프링 프레임워크의 웹 애플리케이션 개발을 위한 모듈
웹 어플리케이션의 구조를 간단하게 유지하고 개발을 용이하게 만들어주는 프레임워크이다.
- 모델(Model):
모델은 애플리케이션의 비즈니스 로직 및 데이터를 나타낸다. Java 객체로 표현되며, 화면에 표시될 데이터나 데이터의 처리 로직을 포함한다.- 뷰(View):
뷰는 사용자에게 보여지는 부분으로, 모델의 정보를 기반으로 화면을 생성. 주로 JSP, Thymeleaf, FreeMarker 등의 템플릿 엔진을 사용하여 구현.- 컨트롤러(Controller):
컨트롤러는 사용자의 입력을 처리하고, 모델과 뷰 사이의 상호 작용을 관리한다. 클라이언트의 요청을 받아 해당 요청을 처리하고, 결과를 모델에 반영하고, 적절한 뷰를 선택하여 클라이언트에게 반환한다.Spring MVC의 특징과 동작:
컨트롤러 매핑:
URL 패턴에 따라 어떤 컨트롤러가 요청을 처리할지를 결정하는 매핑을 정의.HTTP 요청 메서드 매핑:
각각의 컨트롤러 메서드가 어떤 HTTP 요청 메서드(GET, POST, 등)에 응답할지를 지정.데이터 바인딩 및 검증:
사용자 입력 데이터를 모델 객체에 바인딩하고, 데이터 유효성 검증을 수행할 수 있는 기능을 제공.뷰 리졸버(View Resolver):
뷰의 논리적 이름을 실제 뷰로 매핑해주는 역할.인터셉터(Interceptors):
컨트롤러 실행 전, 후에 추가적인 작업을 수행할 수 있도록 하는 기능을 제공.파일 업로드 처리:
파일 업로드를 간편하게 처리할 수 있는 기능을 제공.
- 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); } }