개발자입니다
[비트캠프] 49일차(10주차4일) - Java: (backend, frontend)-app-04~05, 상속, 생성자 본문
[비트캠프] 49일차(10주차4일) - Java: (backend, frontend)-app-04~05, 상속, 생성자
끈기JK 2023. 1. 12. 12:57
04. 의존객체 생성 및 주입 자동화
의존 객체(dependency) : 작업을 수행할 때 사용하는 객체
사용자로부터 요청을 TeacherController가 받으면 결과를 응답한다. TeacherController는 TeacherDao, Teacher 클래스를 사용한다.
TeacherDao를 dependency라 한다. @Component를 붙이면 Spring IoC 컨테이너가 자동으로 생성한다.
Teacher를 Data Transfer Object (DTO), Value Object (VO), Domain Object 라 한다.
*IoC (제어의 역행)
Inversion(역행) of Control(제어)
① 의존 객체 주입 (Dependency Injection; DI)
② 이벤트 리스너 : 호출, 호출 되다가 클릭하면 뜬금없이 호출된다.
SpringBoot 핵심 부품
HTTP 요청을 Web Server가 받으면 Servlet Container로 위임한다. 이를 WebMVC Framework가 실행하고 App. 이 실행한다. WebMVC Framework는 IoC Controller를 사용한다.
App. 에서 결과를 WebMVC Framework로 리턴하고 그 결과를 Servlet Container로 리턴한다. 이 결과를 Web Server로 리턴하고 HTTP 응답한다.
Application Server가 없으면 Spring Framework가 안돌아간다.
TeacherController 인스턴스 만든적 없으나 IoC Container가 만든다.
Web Server는 HTTP Server이고, Servlet Container는 Servlet/SSP 관리 및 실행한다.
WebMVC Framework는 Controller를 실행한다.
App.에는 Controller, Dao, Service, ... 가 있다.
IoC Container는 스프링 컴포넌트 생성 및 관리하는데 Bean Container 라고도 한다.
스프링 컴포넌트는 ① Component, ② Controller, ③ RestController, ④ Service, ⑤ Repository, ⑥ Configuration, ... 으로 표시된 클래스 = 스프링 IoC 컨테이너가 관리하는 클래스이다.
SpringBoot의 Application Server, Spring Framework 모두는 JVM 위에서 돌아간다.
Component와 Class의 관계
Component는 특정한 일(역할)을 수행하는 부품
Component는 연결된 class 들을 포함한다.
Component는 1개 이상의 클래스로 구성된 부품이다.
1개 클래스 = 1 Component
2개 클래스 = 1 Component
3개 클래스 = 1 Component
Component 예
회원 관리 Component는 Member, MemberDao, MemberController로 나뉘어져 있다.
MemberController가 MemberDao, Member를 쓰고, MemberDao가 Member를 쓴다.
MemberController는 요청 처리 Component 이다.
class 와 Bean
Bean : 콩 / Java : 커피 생산지
객체 = bean (Java)
setter/geter = properties 를 갖고 있는 경우를 bean이라 한다. 하지만 없어도 bean(class)이라 하기도 한다.
@Component와 아이들
@Component : 스프링 컴포넌트 = IoC 컨테이너가 자동 생성하는 객체
- @Controller
- @RestController
- @Service
- @Repository
→ Component를 역할에 따라 분류. 이유는 제어(조회, 생성, 제외 등)가 용이하도록.
예) 조회 : Service 객체만 조회
생성 : Dao 객체만 생성
제외 : Controller 생성에서 제어
new로 인스턴스 생성하지 않고 @Autowired로 지정한다.
@CrossOrigin(origins = {"http://127.0.0.1:5500", "http://localhost:5500"})
@RestController
public class TeacherController {
@Autowired TeacherDao teacherDao;
// TeacherDao teacherDao = new TeacherDao();
// 라 하지 않고 @Repository 붙인 TeacherDao 클래스는 이런식으로 인스턴스 생성한다.
또는 아래와 같이 생성자를 통해 인스턴스 생성할 수 있다.
@CrossOrigin(origins = {"http://127.0.0.1:5500", "http://localhost:5500"})
@RestController
public class MemberController {
MemberDao memberDao;
// Spring IoC 컨테이너가 이 클래스의 인스턴스를 만들때
// 생성자를 호출할 때, 파라미터로 선언된 MemberDao 객체를 주입할 것이다.
public MemberController(MemberDao memberDao) {
this.memberDao = memberDao;
}
04. SpringBoot 설정
MemberController의 메서드는 addMember() {-}, getMembers() {-}, getMember() {-} 가 있다.
각 메서드별로 @CrossOrigin을 위에 붙여서 CORS 를 허용한다. ← 메서드마다 세밀하게 CrossOrigin을 제어할 수 있다.
메서드를 모두 CORS 허용할 것이라면 MemberController 위에 @CrossOrigin을 붙인다. ← CrossOrigin이 같다면 간결하게 설정할 수 있다.
MemberController, BoardController, TeacherController 모두 《WebMvcConfigurer》 WebConfig.addCorsMapping() {-} 이다. ← Controller 클래스 모두 CrossOrigin 설정이 같다면 한 곳에서 설정할 수 있다.
@Configuration 설정
@Configuration 에 대한 정보는 아래 Reference Doc.에서 확인한다.
※ 참고: GA = General Availability
GA (General Availability)
필요한 모든 상업화 활동이 완료되어 시장에서 이용할 수 있게 됨을 의미한다.
RC (Release Candidate)
마지막 제품이 될 가능성이 있는 시험판(Beta)으로, 상당한 버그가 나타나지 않으면 출시할 준비가 되었음을 의미한다.
M (Milestone)
특정한 집합의 기능이 포함되며 기능이 완성되자마자 공개된다.
기능의 문제가 있을 수 있다.
SNAPSHOT
개발중인 버전을 의미한다.
아래 부분을 복사해서 필요한 것만 입력한다.
SpringBoot 설정 내용은 아래에 나와있다.
package bitcamp.bootapp.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
// - 이 클래스는 설정에 관련된 일을 하는 클래스임을 선언한다.
// 즉 스프링 컴포넌트로 표시하는 것이다.
// - Spring IoC 컨테이너는 이 클래스의 인스턴스를 자동 생성한다.
//@EnableWebMvc
// - Spring 프레임워크에서 WebMVC 기능을 사용할 수 있도록 관련 객체를 준비시키라고 선언한다.
// - 웹 애플리케이션을 제작할 때 사용할 도구가 완전하게 구비되는 것이다.
// - Springboot의 경우 이 애노테이션을 생략해도 된다.
public class WebConfig implements WebMvcConfigurer {
// - 이 클래스는 WebMvcConfigurer 규칙에 따라 메서드를 만들었음을 선언한다.
// 단, 모든 메서드를 정의할 필요는 없다.
// 이 프로젝트 요구 조건에 맞는 부분만 설정하면 된다. (customizing: 고객화)
// - Spring WebMVC 프레임워크는 이 클래스의 정의된 메서드를 호출하여 설정을 완성한다.
public WebConfig() {
System.out.println("WebConfig 객체 생성됨!");
}
// Cross-Origin 관련해서 기본 값 외 추가로 설정할 게 있다면 이 메서드를 정의한다.
// 스프링부트가 시작되면 이 메서드를 호출하여 CrossOrigin을 설정할 것이다.
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 리턴 값은 CoreRegistration 객체
.allowedOrigins("http://localhost:5500", "http://127.0.0.1:5500")
.allowedMethods("*"); // default : GET, HEAD, POST 이므로 * 지정한다.
}
}
위 설정 후 TeacherController에서 @CrossOrigin을 삭제해도 된다.
// @CrossOrigin(origins = {"http://127.0.0.1:5500", "http://localhost:5500"}) 삭제
@RestController // @Controller 하면 return할때 json으로 변환하지 않는다.
public class TeacherController {
App.java도 @CrossOrigin, @RestController 삭제한다.
package bitcamp.bootapp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// @CrossOrigin("*") 삭제
@SpringBootApplication
// @RestController 삭제
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
05. 상속 활용
Student와 Teacher에서 no, name, tel, createdDate 필드가 동일하다. 여러 클래스의 중복되는 공통코드를 추출하여 새 클래스에 옮긴다.
이를 generalization(일반화)라 한다.
상속 기법 (Inheritance)
"specialization" (전문화)
Car 의 기능 model, maker, cc, capacity 가 있다. ◁━ Truck 의 기능 weight, dumping 가 있다.
기능 확장 → 더 특별한 Car를 정의
"generalization" (일반화)
Car 의 기능 model, maker, cc, capacity 가 있다. ◁━ Truck 의 기능 weight 가 있다.
◁━ Forklift의 기능 type 이 있다.
super 클래스(parent)를 sub 클래스(child)가 상속(extends)한다.
공통 기능 → 여러 클래스들 사이의 공통 필드나 메서드를 추출하여 정의
상속
git\bitcamp-ncp\eomcs-java-lang\app\src\main\java\com\eomcs\oop\ex03
static 필드, instance 필드, local 필드 변수
① static 필드
- 클래스가 로딩될 때 생성된다 (Method Area)
② instance 필드
- new 연산자로 인스턴스 생성할 때 만든다 (Heap)
③ local 변수
- 메서드 호출될 때 만든다 (JVM Stack)
생성자
생성자는 클래스 명과 동일한 이름으로 작성하며 데이터 타입이 없다.
new Score() 에서 ()는 생성자 호출이다. 파라미터에 전달하는 값에 따라 호출할 생성자가 결정된다.
Score() 는 default constructor 이다.
Score("홍길동"), Score("홍길동", 100, 90, 80) 은 생성자가 존재해서 사용 가능하지만 Score("홍길동", 100) 생성자가 존재하지 않아 컴파일 에러 발생한다.
조언
*객체지향은 클래스와 클래스의 관계를 파악하는 것이 중요하다. 그래서 그림을 그리는 것이다.
과제
저녁 학습
com/eomcs/oop/ex05/a~n 까지 학습
'네이버클라우드 AIaaS 개발자 양성과정 1기 > Java' 카테고리의 다른 글
[비트캠프] 50일차(10주차5일) - Java(상속, specialization, generalization, 추상 클래스, 추상 메서드) (0) | 2023.01.13 |
---|---|
[Java] 예제 소스 정리 - 상속, 추상 클래스 (0) | 2023.01.12 |
[비트캠프] 48일차(10주차3일) - Java: (backend, frontend)-app-03 (0) | 2023.01.11 |
[비트캠프] 47일차(10주차2일) - Java: (backend, frontend)-app-02 (0) | 2023.01.10 |
[비트캠프] 46일차(10주차1일) - Java(캡슐화, getter/setter, 접근 범위), app-11~13, backend-app-01~02 (0) | 2023.01.09 |