4차산업혁명의 일꾼/Spring 102

구조안을 돌아다니며 처리하는 패턴(Iterator, Vsitor, Chain of responsibility)

박은종의 객체지향 설계를 위한 디자인패턴 with 자바 구조안을 돌아다니며 처리하는 패턴(Iterator, Vsitor, Chain of responsibility) Iterator 객체 요소들의 내부 표현방식을 공개하지 않고, 객체에서 되지 않은, 외부에서 객체에 순회하는 객체를 만든다. 내부에서 객체의 순차적인 제공을 하지 않음 순회 구현 방식이 다르더라도 동일한 방식(메서드)로 순회 할 수 있게 제공 여러 리스트 객체에 대한 동일한 방식으로 순회하는 방법을 제공하기 위해 순회하는 객체를 따로만듬 ConcreteIterator는 리스트를 순회하면서 각 리스트의 요소를 반환하는 메서드도 제공한다. 다양한 순회방법이 제공될 수 있다. 동일한 Aggregate를 구현한 클래스들은 동일한 방식으로 순회할 수..

복잡한 연결을 단순하고 간단하게 처리하는 패턴(Facade, Mediator)

박은종의 객체지향 설계를 위한 디자인패턴 with 자바 Facade Pattern 이란? 간단한 창구 서브시스템이 여러개인 경우 이를 통합한 하나의 인터페이스를 제공 서브시스템을 좀 더 편하게 이용하기 위한 높은 수준의 인터페이스를 정의 각 서브시스템의 역할이나 의존관계를 내부에서 올바를 순서로 사용할 수 있도록 외부에는 간단한 인터페이스만을 오픈 Facade : 하나의 일관된 인터페이스 제공 (ex : 컴파일러) 복잡한 서브시스템들에 대한 단순하고 기본적인 인터페이스를 앞에서 제공 클라이언트와 서브시스템간의 결합도를 줄임 Mediator Pattern 객체간의 상호 작용을 하나의 객체에서 캡슐화하여 처리 UI 프로그래밍에서 많이 사용되는 방법으로 Widget 간의 상호 처리를 서로간에 처리하는 것이 아..

(State, Observer, Memento:상태저장)상태를 클래스로 표현하여 관리하는 패턴

박은종의 객체지향 설계를 위한 디자인패턴 with 자바 조건에 따른 여러가지 상태를 클래스로 표현하여 관리하는 패턴(State, Observer, Memento) 상태를 관리 State 객체의 기능은 상태에 따라 달라질 수 있는데, 이러한 상태가 여러가지이고, 클래스 전반의 모든 기능이 상태에 의존적이라 하면, 상태를 클래스로 표현하는 것이 적절함 클래스로 분리하지 않게 되면 상태가 여러가지인 경우 많은 if-else 문이 사용되고 추후 상태가 추가되거나 삭제될 때 수정해야 하는 사항이 너무 많아짐 Context : ConcreteState의 인스턴스를 관리하고 서로 상태가 바뀌는 순간을 구현할 수 있다. State : Context 가 사용할 메서드를 선언한다. ConcreateState : 각 상태 ..

디자인패턴 5 : Adapter Pattern(호환)

HTML 삽입 미리보기할 수 없는 소스 https://github.com/MyoungSoo7/DesignPattern GitHub - MyoungSoo7/DesignPattern Contribute to MyoungSoo7/DesignPattern development by creating an account on GitHub. github.com 박은종의 객체지향 설계를 위한 디자인패턴 with 자바 Adapter Pattern : 호환 서로 다른 인터페이스를 중간에서 연결해주는 기능 이미 사용중이거나 정의된 인터페이스들을 중간에서 맞춰서 적용해 줄 수 있음 예) 안드로이드 ListView Adpter 클라이언트에서 사용하던 방식대로 호출하여 사용할 수 있도록 조정해주는 기능 서로 일치하지 않는 인터페..

디자인패턴 4 동일시하기-equate : (Decorator)와 위임하기(Composite)

https://github.com/MyoungSoo7/DesignPattern GitHub - MyoungSoo7/DesignPattern Contribute to MyoungSoo7/DesignPattern development by creating an account on GitHub. github.com 디자인패턴 4 동일시하기(Decorator)와 위임하기(Composite) Decorator Pattern 장식과 실제 내용물을 동일시 객체에 동적으로 책임을 추가 상속을 사용하지 않고 기능의 유연한 확장이 가능한 패턴 객체에 동적으로 새로운 서비스를 추가 할 수 있음 전체가 아닌 개별적인 객체에 새로운 기능을 추가 할 수 있다 단순한 상속보다 설계의 융통성을 증대 Decorator의 조합을 통해 ..

Querydsl 과 Fetch 전략 그리고 JPA N+1 문제

Querydsl은 스프링 Data JPA와 연동이 잘된다. eager Fetch 의 lazy Fetch 차이 fetch 전략을 짜야 한다. fetch 전략의 설정 효율성 - 데이터가 어느 쪽으로 더 자주 사용될 것 같은가 예측 • default 내버려두기: 필요한 시점에 최선의 방식으로 데이터를 가져옴 • LAZY 사용: 연관 관계가 있는 엔티티에서 자식 엔티티만 가져오는 시나리오일 때 • 프로그래머가 로직 흐름에서 join 을 의식하고 있지 않음 • LAZY 세팅이 후속 쿼리 발생 방지를 보장하지는 않음 • ex: 불러들인 자식 엔티티가 서비스 레이어 어딘가에서 결국 부모 엔티티 필드를 건드렸을 경우 • EAGER 사용: 연관 관계가 있는 엔티티에서 무조건 다 가져오는 시나리오일 때 • 프로그래머가 j..

Spring Data JPA 테크닉

@Repository 로 실상 JPA로 DB와 연결된다. Query method 의 특징은 하기와 같다. 추가로 알아두면 좋은 어노테이션들 @Entity 객체로 DB를 생성한다. DataSource로 물리적인 DB 정보를 담는 인터페이스로 다양한 구현체를 사용한다. TransactionManager 로 트랜잭션 관리기능을 담당하는 인터페이스이다. 세팅 구성은 DataSource(DB설정) -> EntityManagerFactory( JPA엔터티 관리) -> PlatformTransactionManager(트랜잭션관리) 트랜잭션에 관해서는 중복에 관한 Propagation 고립에 관한 isolation 레벨이 있다. @Transaction:Propagation은 중첩된 트랜잭션의 동작 규칙이다. @Requ..

H2 Database

H2 Database~! 설정한대로 로그인하고 들어가면 된다.~! Driver Class 는 org.h2.Driver~! application.properties에 설정 되어있다. 참고로 한국어로 설정도 된다. 한국어를 지원하는 것은 별개로 하고 웹에서 편리하게 쓰는 DB인데 Auto Commit 지원하고 한번에 조회 가능한 Max rows 지원되고 자동 완성 기능 지원된다. 테이블 클릭하니 select문 자동완성!! 테스트용으로 다양한 테이블을 Clear로 지우고 클릭해서 실행해보기 참 편리하다 위는 AOP 부가기능으로 만들었던 유저별 API 조회시간 테이블이다.(관리자만 접근 가능한 API..) 여러 테이블 클릭으로 계속조회하고 카카오 OAuth로 가입한것은 이메일과 카카오 아이디가 부여된다. 참 재..

스프링 스케줄러~!

상품 클래스에 상속할 추상클래스인 Timestamped 만듭니다. @MappedSuperclass 어노테이션으로 멤버 변수가 컬럼이 되게 합니다. @EntityListeners 어노테이션으로 변경되었을 때를 자동으로 기록합니다.(AuditingEntityListener.class) 이것을 스프링부트 설정에 추가로 @EnableScheduling 로 스케줄러 작동하게 합니다. @EnableJpaAuditng 어노테이션으로 시간자동변경이 가능하게 합니다. 설정했으니 제품 클래스에 Timestamped 추상클래스를 상속합니다. 제품클래스에 스케줄러로 가격변경을 자동화시킬 메소드를 추가합니다. 자 그리고 스케줄러를 만들어줍니다!!! 크론 : 새벽 한시에 매일 돌게 합니다. @RequiredArgsConstruc..

오픈 API 호출과 ajax 호출

ajax는 아래와 같은 형태다 GET/POST의 타입과 호출 url 그리고 data 로 같이 보낼 것 성공시 callbak 실패시 callback 호출 형태다 $.ajax({ type: '', url: '' data : {} success: function(response){} }); 아래와 같이 날씨, 미세먼지 API 의경우 타입은 GET으로 URL은 오픈API 그리고 data는 비어있고 success 에 가져올 타입만 받으면 되는데 보통 json 타입으로 온다. 위의 API 는 웹사이트에서 아래와 같이 표시된다.

스프링JPA- Spring Data JPA(ORM) Hibernate ~! (페이징,정렬 기본)

JPA는 Java Persistence API로 자바 ORM기술에 대한 표준명세이다. JPA는 표준명세이고 , 이를 실제 구현한 프레임워크 중 사실상 표준이 하이버네이트(Hibernate)이다. 스프링부트에서는 기본적으로 하이버네이트를 사용중이다. JPA는 Entity 저장, 조회를 약속된 표준으로 처리해준다. Entity(디비테이블) 설정시 아래와 같은 어노테이션을 두어 Entity 관계설정도 가능하다. Spring Data JPA ID 외의 필드에 대한 추가 기능은 interface 만 선언해 주면, 구현은 Spring Data JPA 가 대신! Product Dto의 Page가 선언된 findAllByUserId 인터페이스가 완성되었다. Users Dto의 3가지 인터페이스가 있다. Folder D..

스프링 JWT

JWT는 로그인 정보를 서버에 저장하지 않고 클라이언트에 로그인 정보를 JWT로 암호화하여 저장하여 JWT통해 로그인 인증 및 권한을 인가하는 것이다. JWT의 장점은 동시 접속자가 많을 때 서버에 부하를 낮출수 있다.(OAuth와 같이 클라이언트와 서버가 다른 도메인을 사용할 때 JWT Token을 사용하면 서버의 부하가 낮아진다.) JWT의 단점은 복잡하고 JWT에 담는게 많아질수록 네트워크 비용 증가되며 기생성된 JWT를 일부만 만료시킬방법이 없고 Secret key 유출시 JWT조작이 가능하다. 이상 JWT로그인 설명을 간략하게 마친다. 보다 상세한것은 하기 URL참조 https://velog.io/@shinmj1207/Spring-Spring-Security-JWT-%EB%A1%9C%EA%B7%..

카카오 로그인 OAuth 기능 구현

카카오 로그인 구현 요청은 위와 같다. 자 인증코드 받은것으로 토큰이 전달되면 그것으로 API를 호출하는 것이다. 토큰이 유효한지 확인하여 유효하면 로그인이 되는 것이다. 카카오 디벨로버 사이트에서 해당 웹사이트를 등록할수 있다. Kakao Developers 내 애플리케이션 카카오계정 로그인 여기를 눌러 링크를 확인하세요. accounts.kakao.com 어플리케이션 등록한후 앱설정의 플랫폼에 가서 웹플랫폼을 등록한다. 그리고 나서 로그인후 인가토큰을 받게될 Redirect URI(callback) 을 설정한다. 인가코드 요청은 html에서 하기와 같이 할수 있다. ' 본인의 발급받은 REST_API_KEY와 지정한 REDIRECT_URI를 입력한다. 발급받은 REST_API_KEY는 하기 카카오계정..

스프링 시큐리티 - Spring Security

스프링 시큐리티 사용법을 살펴보자 일단 설정관련 어노테이션을 주고(@Configuration) 인터페이스 스프링 시큐리티 어노테이션을 쓰고 (@EnableWebSecurity) 인터페이스 시큐어가 전역의 메소드에 활성화되는 어노테이션을 준다. (@EnableGlobalMethodSecurity) 그리고 나서 하기와 같이 BCrypt 암호화 객체를 메소드로 등록도 하고 본격적으로 HttpSecurity의 설정을 해준다. csrf 설정을 disable 해준다. https://velog.io/@woohobi/Spring-security-csrf%EB%9E%80 Spring security - csrf란? 모든 코드는 github에 있습니다.최근에 Spring security를 한창 공부하고 있는데 (조만간 블..

의존성 주입[DI]과 역전제어[IOC]

스프링에서 우리가 의존성 주입으로 흔히 보는 것은 @Component , @Autowired , @Quailfier , @Resource 같은 것들이다. 스프링의 의존성 주입은 강한결합을 느슨하게 해준다. 의존적으로 주입되어 있어서 결합도가 느슨해 진것이다. 스프링 프레임워크로 인해 제어를 프로그래머보다 프레임워크로 하게 됨으로써 제어의 역전 현상이 일어난다. 이 IOC된 프레임워크에 주입된 객체 빈(Beans)들을 사용하는 것이다. 이것은 우리가 실생활에서 용도에 맞게 만들어진(IOC) 가위를 가져다 사용하는 것과 같다.(하기참조) 스프링 프레임워크란? The Spring Framework provides a comprehensive programming and configuration model fo..

리팩토링(refactoring)

프로그래밍 방식에는 객체지향과 절차지향이 있다. 프로그래밍 방식에는 인간의 직관적으로는 절차에서 객체로 리팩토링하는 것이 순차적인 편이다. [참고] 이해를 돕기위해 위의 절차지향 프로세스를 컨트롤러와 서비스 레지스토리 이 세개로 분리해서 보면 하기와 같다. 컨트롤러와 서비스 리포지토리로 나누는데=> 컨트롤러는 요청/응답 서비스에서 비즈니스 로직 리포지토리에서 DB연결 이렇게 주제별로 역할을 나누어서 한다 보통 각각 @Controller, @Service, @Repository 라는 어노테이션을 사용한다. 바로 이것이 그래서 객체지향 설계도의 기본으로서 스프링에서 CRUD하면 자주 보게 되는 것이다. 절차지향을 객체지향으로 리팩토링해서 쓰고 있는 @Controller, @Service, @Repositor..

Rest API 와 @ResponseBody

Rest API 는 하기와 같이 API 설계도~! RestAPI는 크게 자원(URL) 행위(Http Method) 그리고 표현(Json , xml,)으로 나눈다. 보통 Rest 라고 하면 Json을 많이 쓴다. 회원관리 API 를 보면 API 호출 방법을 보여준다~! 로그인 API~! 물론 GET / POST방식으로 주로 보내는데 PUT까지도 쓰인다. GET방식은 파라미터를 달고 가고 주로 조회용으로 쓰이고 POST방식은 BODY에 가져가면 수정,삭제 등 다양한 방식으로 사용가능하다 @ResponseBody 는 Http Body에 들어갈 내용을 하기와 같이 직접 입력하는데 @RestController = @Controller + @ResponseBody 등 이다.

스프링 AOP~!

AOP는 간단하게 객체의 부가기능 설계라고 보면된다.(OOP 주기능) 주기능 사이에 부가기능을 넣어줄수 있다. AOP는 부가기능으로 어드바이스로 @Around 로 핵심기능 수행전과후에 동작하게 할수 있다. 어드바이스의 종류는 하기와 같이 5가지가 있다. 포인트 컷의 expression language의 형태는 하기와 같다. 참고로 Setter, Getter , NoArgsConstructor, Entity 는 어노테이션으로 스프링부트에서 자동생성가능하다 할때 ApiUseTime 을 JPA로 DB와 연결하고 API 사용시간의 시작과 끝시간을 사용자마다 계속 등록하고 업데이트해주는 기능을 만들수 있다. 즉 사용자의 API사용시간~! 최다 사용시간을 사용하는 부가기능을 만드는데 있어서 @Aspect @Comp..

스프링 DI~ 의존성 주입이라 불리는 객체의 상황적 연결

스프링 DI는 의존성 주입으로 그냥 연결적인 면이다. 마치 건전지 바꿔서 주입할 수 있듯이 @ 어노테이션 주입가능하게 하고.. [@Component는 객체 주입] @Component class Engine{} @Component class TurboEngine extends Engine{} @Component class SuperEngine extends Engine{} @Value("red") String color; @Value("100") int oil; @Autowired Engine engine; @Autowired Door[] doors; @Autowire 객체로 연결, @Resource는 이름으로 연결 @Value는 변수 값지정 [root-context 설정시] 보통 하기와 같이 컴포넌트 객..