- 프로그래밍
- 지역적 변화의 영향이 최소화 되어야 한다.
- 중복적인 코드가 최소화 되어야 한다.
- Logic 과 Data 의 결합이 필요하다.
- 변화 주기가 비슷한 Logic 과 Data를 모아야 한다.
- OOP 란?
- Object란? 프로그램의 독립적인 최도 단위.
- Object간에 서로를 알 필요 없이, 상호 주고 받는 프로그래밍.
- Object = Message + Data&Logic
- 유연한 Software 개발이 용이해짐.
- OOP 조건
- 1) 추상화 : 공통의 속성이나 기능을 묶어서 정의 하는것.
- 2) 캡슐화 : Code의 재수정 없이 재활용 할 수 있도록, 객체의 속성과 기능을 정의 하는것.
- 3) 은닉화 : 외부에서 직접 접근을 하지 못하게 하는것.
- 4) 상속성 : 상위Class의 속성 및 기능을 하위Class에 물려주는것.
- 5) 다형성 : Overriding. 상속을 확장해 사용하는것.
- OOP 5대 원칙
- 1) 단일 책임 원칙 : 어떤 Class를 변경하려는 이유는 하나 뿐 이어야 한다.
- 2) 개방-패쇄 원칙 : Object를 수정하였을때, 다른 Object의 수정이 필요 없어야 한다.
- 3) 리스코프 치원 원칙 : 상속하위타입의 Object로 치환 하였때, 아무런 문제가 없어야 한다.
- 4) 인터페이스 분리 원식 : Interface를 잘 나누어야 한다.
- 5) 의존관계 역전 원칙 : ...
- Object역할 종류
- information Expert : 특정 정보를 다루는 Object.
- Controller : Object간 이벤트를 제어하는 Object.
- Creator : 특정 Object를 생성하는 Object.
- High Cohesion : ...
- Low Coupling : ...
- Indirection : ...
- Pure Fabrication : ...
- Polymorphism : ...
- Protected Variation : ...
- Design-Pattern 이란?
- OOP 개발을 하는 반복적인 패턴을 정리하여, 만들어 짐. (객체지향 프로그래밍-디자인-모델링)
- 1) strategy pattern : 알고리즘을 바꾸기 유용하게 구현.
- 2) template method pattern : 인터페이스등 통해, 실수행을 하위객체로 하는 life-cycle 구현.
- 3) state pattern : 상태를 관리하는 상태객체를 통에 처리하도록 구현.
- 4) observer pattern : 상태가 변화면 다른객체들에게 알려주어 처리하도록 구현.
- 5) decorator pattern : 하위 클래스를 활용하여 기능을 확장으로 구현.
- 6) factory pattern : 객체 생성을 하위 클래스에서 하도록 구현.
- 7) command pattern : 사용자의 명령어에 따라, 그에 맞은 처리를 할도록 구현.
- 8) adapter pattern : 신규객체가 기존객체외 연결(연동or호환) 가능 하도록 구현.
- 9) facade pattern : 내부 복작한 로직을 간단한 인터페이스로 바꿔 구현.
- 10) composite pattern : 객체들을 묶어서 통합 관리함.
- 11) proxy pattern : 작업을 대신해주는 객체를 이용.
- 12) visitor pattern : 객체 구조에서 기능을 분리, 확장은 후에 기능객체에서 할수 있다.
- Spring Framework 란?
- 철학(Mission Statement) : J2EE를 손쉽게 사용 할 수 있도록한, 인터페이스 설계 프로그래밍.
- 예) Program 개발 = UI -> ILogic -> LogicImp -> IDAO -> DAOImp (Object 선택의 유연성 제공)
- 오픈소스 경량급 Framework (개발에 필요한 Java Object 생성 및 조립)
- IoC, DI, AOP, MVC 등의 개념으로 동작을 함.
- Bean 설정 및 OOP 개발 및 테스트.
- Framework 란?
- Application을 구성하는 큰틀을 제공하여서, 비지니스 Core만 구현 하도록 해주는것.
- IOC(Inversion Of Control) 란?
- 날 호출 하지마, 내가 널 호출 할께!
- 기존의 제어흐름 구조가 바뀐 동작방식. (개발자가 Object를 직접 생성 하지않고, Framework가 함)
- 각 Object는 전체 흐름을 알 필요 없다. (호출을 당할때, 자신의 일만 잘 하면 됨)
- 즉, Object는 자신이 어디서 사용되는지? 신경쓰지말고~ Framework에 모든것을 위임
- Framework 와 Object 간의 Dependency가 동적인 구조라서, 강력함.
- 예) [Framework] -> {Interface} -> (Class) -> {Interface} -> (Class) ???
- // TODO : Object-Composition(합성) 을 동적으로 활용 ???
- IoC 방식으로는, DL(dependency lookup) 와 DI(dependency injection) 가 있음.
- 결론적으로, Spring == IoC Framework
- DL(dependency lookup) 과 DI(dependency injection) 란?
- Dependency 란?
- run-time시, 바뀔수있는 Object간의 의존관계.
- Object-Composition(합성) 으로, 상속을 하지않고도 최대한 수정없이 재사용을 하고싶다.
- // Object-Composition(합성) 은 Object 내부를 Interface들로 필요한 Class들을 조합 ???
- DL(dependency lookup)
- 저장소에 있는 Bean에 접근하기 위해, 개발자들이 Container API의 callback에 의존하여 lookup을 하는 방식.
- 토비 선생은 비추천 했다고 함...
- DI(dependency injection)
- 제 3의 존재(XML, 어노테이션 등) 를 기반으로, 컨테이너가 Object간 Dependancy를 맺어준다.
- (물론, 이 제 3의 존재 때문에... 욕을 많이 먹는편!)
- Object간 Decouple를 막아, 느슨한 결합의 Application이 되는것.
- 결론적으로, Spring은 경량 컨테이너.
- (Enterprise서비스, Thread관리, Object풀링, Clustering, Transaction, Logging, ... )
- 인스턴스 Scope 제어. (매번 new 생성이냐? Singleton이냐?)
- 인스턴스 LifeCycel Event 제어. (생성 및 소멸 등등)
- Dependency 란?
- AOP(Aspect Oriented Programming) 란?
- 관점지향 프로그래밍.
- Transaction, Logging, Auth 등등의 공통화 할 수 있는 Logic을 따로빼서(횡단분리) 관리하는 것.
- 공통화 할 수 있는 Code의 재사용을 통해, 간소화를 하는 것.
- Aspect
- 공통화 하고 자하는 횡단관심사.
- 한 개 이상의 PointCut 과 Advice 의 조합으로 정의.
- JoinPoint
- Aspect의 Advice가 적용이 되는 위치.
- JoinPoint jp 으로 해당위치 API 제공. (예 : jp.getAgrs(), jp.getSignature(), jp.proceed())
- Advice
- Aspect의 실직적인 기능.
- @Before, @After, @AfterReturning, @AfterThrowing, @Around
- PointCut
- Advice가 적용되는 Join Point를 정의하는 모듈.
- return-type, package, class, method, argument 등의 표현식 제공.
- (예 : "execution(* com.test.member.MemberService.getMember(..))")
- Target
- Advice를 받을 대상. 즉 Object 의미.
- Weaving
- Advice에 PointCut를 입히는 행위.
- MVC 란?
- (비지니스로직을 처리하는) 'Model'과 (화면을 나타내는) 'View'를 분리 위해, 이 사이에 'Controller'를 둠.
- Model : 백그라운드에서 동작하는 비지니스로직.
- View : 결과를 보여주는 화면.
- Controller : 사용자 입력의 처리 및 제어.
- Bean 이란?
- Spring(IoC Framework) Container의해 관리되는 Java Object.
- POJO 란?
- Plain Old Java Object
- 태초의 아주 단순한 자바 객체.
- (Java EE 등의 중량 Framework에 종속되어 사용되는 "무거운"객체에 반발로 나오게된 용어)
- 순수하게 setter,getter 으로 이루어진 Value Object성의 Bean을 의미.
- Class 상속을 강제하지 않고, Interface 구현을 강제하지 않고, 어노테이션 사용을 강제하지 않는다.
- 무거운 종속성에서 벗어나, 본연의 비지니스로직에만 집중을 할 수 있다.
- Singleton 이란?
- 하나의 전역 new 인스턴스 으로 메모리 낭비를 방지.
- 다수의 인스턴스에서 발생 할 수 있는 간섭 방지.
- 나쁜 예)
-
public class Singleton { private static Singleton SINGLETON; public synchronized Singleton getInstance() { // synchronized 특성상 성능저하가 발생하므로, 첫생성 이후에 synchonized 하지 않도록... if(SINGLETON==null) { synchronized(Singleton.class) { if(instance == null) { SINGLETON = new Singleton(); } } } return SINGLETON; } }
-
- 좋은 예)
-
public class Singleton { // 개발자가 직접하기 보다는, JVM 초기화 과정에서 보장되는 원자성을 활용하는게 가장 좋다. // (instance가 static이기 때문에 로딩시점에 한번만 호출될 것이며 final을 사용해 다시 값이 할당되지 않도록 만든 방법) private static class SingletonHolder { public static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }
-
- 철학(Mission Statement) : J2EE를 손쉽게 사용 할 수 있도록한, 인터페이스 설계 프로그래밍.
- ...
- 서블릿(Servlet) 이란?
- SUN사에서 제안한 웹서비스를 위한 인터페이스.
- 원칙적으로는 javax.servlet.Servlet 인터페이스의 구현체.
- (특별한 main문 없이) Servlet-Container에 의해서, 비지니스로직의 실행 및 관리.
- Servlet-Container은 HTTP 요청시, Servlet을 ServletRequet, ServletResponse와 함께 호출합니다.
- ...
- JPA Vs MyBatis
- MyBatis
- XML 형식으로 Insert, Select, Update, Delete 쿼리 작성.
- (Data용) POJO 클래스 생성.
- DAO(Data Access Object) 클래스 생성
- 테이블의 변경에 따라, 일일이 해당 쿼리를 변경해야하기 때문에~ 리팩토링 하기가 쉽지 않은 단점.
- JPA
- 각 테이블에 대응하는 Entity만 생성하면 됨. (Domain Object 중심의 개발)
- Entity간의 관계를 어너테이션으로 설정. (예 : @OneToOne, @ManyToOne, @OneToMany, ... )
- 테이블 변경에도, 대응이 가능하기 때문에~ 리팩토링 하기가 쉬운 장점.
- (작성해야하는 량이 MyBatis 대비... 어림잡아 1/3로 준다고 함)
- 대부분의 ORM이 그러하듯, SQL을 직접 작성하는 것보다는 성능이 비교적 떨어짐. (단점)
- 복잡한 통계 데이터를 다루어야 할 때에는... 답답한 어려움이 있음. (단점)
- (그래서 JPQL을 지원하긴 함)
- (번외) PreparedStatement 와 Statement
- PreparedStatement 쿼리 란?
- 쿼리를 처리하는 "parse -> bind -> execute -> fetch" 과정을 효율적으로 하기 위함.
- 반복적으로 SQL 실행시, 준비과정 없이~ 좀 더 낮은 CPU사용 과 좀 더 빠른 결과를 얻을 수 있음.
- SQL injection 을 원천적으로 봉쇄하는 효과도 있음.
- (왜냐하면, Query-Templete은 이미 고정이 되어서, 이전에 parsing 되어있기 때문에~
- 이후에 binding 되는 ? 값은 문법적인 의미를 가질 수 없음)
- MyBatis
- ...
- Spring Boot 란?
- 최소한의 설정으로 더쉽게 Spring Framework 이용 할 수 있도록 하는 서브프로젝트.
- 로깅
-
- 0.벌목 1.통나무 2.(특히 항해운항비행 등의) 일지 3.일지에 기록하다
- Lumberjack World Championships : Log Rolling
- (surfing terms glossary) Log : Another name for a longboard...
- Derived from the fact It's big and somewhat cumbersome. Derivatives are logging and logger.
- Jakarta Common Logging
- JCL 이란?
- 추상화(interface) 라이브러리.
- 구현체(instance) 라이브러리를 선택하여 사용.
- 예) Log log = LogFactory.getLog(this.getClass());
- JCL 메커니즘
- 1) commons-logging.properties 에서 찾음.
- 2) Class-Path 에서 (Log4J) 찾음.
- 3) JDK 1.4 API사용. (Jdk14Logger)
- 4) 못찾으면, Default사용. (SimpleLog)
- JCL 꺼리는 이유
- Class-Loader 의존적 방식으로 찾기 때문에... (RunTime때 찾음?)
- 대안으로 SLF 가 있음. (CompileTime때 찾음?)
- JCL 이란?
- Simple Logging Facade
- SLF 이란?
- 추상화(interface) 라이브러리.
- SLF4j API : ...
- SLF4j Binding : ...
- SLF4j Bridge : ...
- https://www.slideshare.net/whiteship/ss-47273947 참고...
- SLF 이란?
-
- ...
-끝-
'랭귀지&프레임웤' 카테고리의 다른 글
Python 이란? (0) | 2019.11.06 |
---|---|
STS 개발 (0) | 2019.11.06 |
Spring Cloud 란? (0) | 2019.11.06 |
Spring Batch 란? (0) | 2019.11.06 |
자바 메모장 (0) | 2019.10.23 |