728x90

springboot 42

[Spring] 비즈니스 로직 층의 설계와 구현

비즈니스 로직 층의 역할은 도메인 모델인지, 트랜잭션 스크립트인지 관계없이 업무 처리(비즈니스 로직)를 하는 것 비즈니스 로직과 밀접한 관계가 있는 트랜잭션 처리는 잘 대응해야 함 5.1 트랜잭션이란? - 트랜잭션이란 관련된 여러 처리를 하나의 큰 처리로 취급할 경우의 단위 - 트랜잭션 내의 모든 처리가 성공했을 때 트랜잭션이 확정 - 트랜잭션 내에서 하나라도 실패할 경우 트랜잭션이 시작하기 전의 상태로 롤백 (1) 여러 업무에 걸쳐진 트랜잭션 예) 고객이 주문한 상품을 공장에 발주하고 물건이 도착하면 고객에게 출하하기 전까지의 트랜잭션 단위 (2) 하나의 사례에서 사용자로부터의 여러 요청에 걸쳐서 발생하는 트랜잭션 예) 상품의 재고를 화면에 표시하고, 출하할 상품 수를 입력한 후 확정 버튼을 누르기까지..

[Spring] 데이터 액세스 층의 설계와 구현

4.1 데이터 액세스 층과 스프링 - 데이터 액세스 층은 데이터 액세스 처리를 비즈니스 로직 층에서 분리하여 따로 만들어준 층 - 데이터 액세스 처리와 비즈니스 로직이 섞여있으면 유지보수가 어렵고, 코드 가독성이 떨어진다. 4.1.1 DAO 패턴이란? - DAO 패턴은 데이터의 취득, 변경 등 데이터 액세스 처리를 DAO라고 하는 오브젝트로 분리하는 패턴 - 데이터 액세스 방식이 바뀌어도 DAO만 변경하면 된다. - DAO 클래스는 DB의 테이블별로 만든다. 4.1.2 자바의 데이터 액세스 기술과 스프링의 기능 - 자바의 데이터 액세스 기술 (1) JDBC (2) 하이버네이트 & JPA 등 고성능 ORM 프레임워크 (3) MyBatis(iBATIS) (4) 독자 개발한 프레임 워크 등 - 스프링은 여러 ..

[Spring] 스프링 시큐리티 (2)

7.4 스프링 시큐리티의 기본 구조 7.4.1 SecurityContext, Authentication, GrantedAuthority - SecurityContext는 인증, 인가 정보를 관리하는 오브젝트 - SecurityContext는 Authentication 오브젝트를 소유하고 있음 - GrantedAuthority는 인가 정보를 나타내는 오브젝트 7.4.2 AuthenticationManager와 AccessDecisionManager - AuthenticationManager 오브젝트는 인증 처리를 실시하는 오브젝트 인증: 사용자의 신원을 검증하는 행위로서 보안 프로세스에서 첫 번째 단계 - AccessDecisionManager는 인가 처리를 실시하는 오브젝트 인가: 사용자에게 특정 리소스..

[Spring] 스프링 시큐리티 (1)

7.3 스프링 시큐리티 - 인증, 인가 기능의 공통 기반 제공 - 웹앱에서 인증, 인가를 구현하기 위한 각종 필터 클래스 제공 - Bean 정의 파일이나 프로퍼티 파일, 데이터베이스, LDAP 등, 여러 리소스로부터 인증, 인가 정보 취득 가능 - HTTP BASIC 인증이나 화면에서의 폼 인증 등, 웹앱에서 일반적으로 선택되는 인증 지원 - 메소드 호출에 대한 액세스 제어에 AOP 사용 가능 - 시큐리티 공격에 대한 방어 기능을 제공(CSRF 대책, Session Fixation 대책 등) 7.3.1 스프링 시큐리티의 설정 파일 - Bean 정의 파일(XML) - JavaConfig 파일 @EnableWebSecurity protected class SecurityConfig extends WebSec..

[Spring] 스프링 AOP (2)

@Configuration @EnableAspectAutoProxy public class AppConfig { @Bean public ProductServiceImpl productService() { return new ProductServiceImpl(); } @Bean public ProductDaoImpl productDao() { return new ProductDaoImpl(); } @Bean public MyFirstAspect myFirstAspect() { return new MyFirstAspect(); } } 스프링 코어 중 다른 하나인 DIxAOP 컨테이너의 AOP에 대해 알아보기 3.2.2 어노테이션으로 어드바이스 만들기 Before 어드바이스, After 어드바이스 - 어노테이..

[Spring] 스프링 AOP (1)

스프링 코어 중 다른 하나인 DIxAOP 컨테이너의 AOP에 대해 알아보기 - DI 컨테이너란 오브젝트 사이에 밀접한 의존 관계를 가지지 않게 하고, 인터페이스에 의한 약한 결합을 쉽게 만들어 소프트웨어의 컴포넌트화를 촉진하며, 오브젝트의 생명 주기를 관리할 수 있게 하는 것 - DI 컨테이너만으로는 온전한 아키텍처를 개발할 수 없음 - AOP가 있으면 로깅이나 트랜잭션 등의 처리를 따로 관리할 수 있게 구현하는 기술 3.1 AOP란 - AOP란 업무 등 특정 책임이 있는 클래스 같이 본질적이지 않은 처리들을 밖으로 꺼내는 기술 3.1.1 AOP 용어 애스펙트(Aspect) - 횡단 관심사의 동장과 그 횡단 관심사를 적용하는 소스 코드상의 포인트를 모은 것 어드바이스(Advice) - 조인 포인트에서 실..

[Spring] 스프링 DI (2)

스프링 코어 중 하나인 DI에 대한 개요, 특징, 이용 방법 및 DI를 어떻게 이용할 것인가에 대한 설명 2.5 JavaConfig를 이용한 DI - XML파일 작성 대신에 Java 코드를 작성한다. 2.5.1 예제를 이용한 JavaConfig https://devhooney.tistory.com/9 스프링 DI (1) 스프링 코어 중 하나인 DI에 대한 개요, 특징, 이용 방법 및 DI를 어떻게 이용할 것인가에 대한 설명 2.1 DI란 - DI는 '의존 관계의 주입'이다. - 오브젝트 사이의 의존 관계를 만드는 것. -> 오브젝트 devhooney.tistory.com - 이 글에서 작성했던 ProductService, ProductDao 등의 샘플을 JavaConfig로 수정한다. - AppConfi..

[Spring] 스프링 DI (1)

스프링 코어 중 하나인 DI에 대한 개요, 특징, 이용 방법 및 DI를 어떻게 이용할 것인가에 대한 설명 2.1 DI란 - DI는 '의존 관계의 주입'이다. - 오브젝트 사이의 의존 관계를 만드는 것. -> 오브젝트의 인스턴스 변수에 그 오브젝트가 이용할 오브젝트를 설정한다는 의미. - 학술적으로 어떤 오브젝트가 이용할 오브젝트를 주입 혹은 인젝션(인스턴스 변수에 설정)한다는 의미. - DI를 구현하는 컨테이너는 클래스의 인스턴스화 등의 생명 주기 관리 기능이 있는 경우가 많다. 2.2 DI를 사용할 곳 - 보통 컨트롤러, 서비스, DAO의 의존 관계를 구축할 때 2.3 어노테이션을 이용한 DI 2.3.1 기본 - @Autowired와 @Component - ProductService 인터페이스 publ..

[Spring] @PutMapping, @DeleteMapping 403 Forbidden 에러

윈도우 환경인 로컬에서는 잘되던 @DeleteMapping이 리눅스 환경에 배포 후 안된다. - 환경설정 문제인거 같아서 관련 내용으로 구글링 - SecurityConfig에 아래 내용을 추가해봤지만 효과가 없었다. .antMatchers(HttpMethod.DELETE,"/**") - WebConfig를 수정하니 효과가 있었다. @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(("/**")) .allowedOrigins("*") .allowedMethods( HttpMethod.GET.name(), HttpMethod.HEAD.name(), HttpMethod.POST.name(), HttpMethod...

[Javascript] 웹으로 PDF 띄우기

회사 요구사항으로 PDF를 뛰워야했다. - 이전에 Java로 띄웠었는데, 간편하게 Javascript로 가능하다. window.open('서버파일경로+파일명.확장자'); - Java로 하면 FileInputStream fis = null; BufferedOutputStream bos = null; try { String pdfFileName = "경로+파일명.확장자"; File pdfFile = new File(pdfFileName); // 클라이언트 브라우져에서 바로 보는 방법(헤더 변경) response.setContentType("application/pdf"); // 이 구문이 있으면 [다운로드], 이 구문이 없다면 바로 target 지정된 곳에서 띄울 수 있다. //response.addHead..

728x90