쉼표는 있어도 마침표는 없다
블로그
전체 112022. 08. 28.
2
[Spring Boot]11.JPA 사용
※JPA란? JPA(Java Persistence API)란 자바 객체와 데이터베이스 테이블간의 매핑을 처리하는 ORM(Object Relational Mapping)기술의 표준입니다.ORM : 객체와 관계를 설정하는것.(객체와 관계형 데이터베이스의 매핑을 도와주는것))이러한 ORM의 개념을 구현하기 위한 표준이 JPA이다.JPA 프로바이더 : JPA에 대한 실제로 기능을 구현한 구현체가 필요한데 이를 구현한 제품이나 프레임 워크로 하이버네이트,이클립스 링크등의 구현체>JPA의 장점개발이 편리- CRUD용 SQL을 직접 작성하지 않아도 된다.데이터베이스에 독립적인 개발이 가능하다.- JPA는 특정 데이터베이스에 종속적이지 않기 때문에 데이터베이스와 관계없이 개발할수 있음.- JPA가 해당 데이터베이스에 맞는 쿼리를 알아서 생성해준다.유지보수에 대한 용이성- 마이바티스처럼 프레임워크를 사용하면 데이터베이스 중심의 개발을 하기때문에 수정시 관련 테이블을 전부 수정해야되는데 비해 JPA같은 경우 객체만 수정하면 된다.>JPA 단점학습곡선이 크다- SQL을 직접적으로 사용하지 않기 때문에 튜닝등을 할때도 어려움이 있다.- 개발자가 배워야 할 부분이 많아진다.(데이터 베이스 위주가 아니기 때문에)특정 데이터베이스의 기능을 사용할 수 없다.- 오라클등. 강력한 함수를 제공해 주지만 데이터 베이스에 종속적인 기능을 사용할 경우 데이터 베이스에 독립적인 개발이 불가능해진다.객체 지향 설계가 필요하다.- 객체 위주의 설계이다 보니객체 및 비즈니스 로직이 설계,개발하기 어려울수 있음 이제 JPA를 Spring Boot에 설정해 보자1.application.properties파일에 아래와 같이 셋팅해 준다.2.DatabaseConfiguration클래스에 JPA설정 빈을 등록한다.3.자바8에 있는 날짜 및 시간 관련 클래스를 그대로 사용할 경우 MySQL의 버전에 따라 문제가 발생할 수 있어 Jsr310JpaConverters적용 방법을 사용 - build.gradle파일에 spring-boot-starter-data-jpa를 추가한다.- 설정 후 아래와 같이 BoardApplication.java처럼 셋팅을 해준다.- 아래와 같이 JPA엔티티를 설정해 준다.- controller와 service는 기존과 같아 따로 설정할 필요가 없다.(url설정같은 부분만 변경해주면됨)- 아래와 같이 serviceImpl을 JPA에 맞게 변경해준다.(save,findById등등)- FileUtils.java를 JPA에 맞게 수정해 준다.(Entity를 변경해준다.)- Repository를 작성해 준다.( Repository는 스프링 데이터 JPA가 제공하는 인터페이스입니다.) ※스프링 데이터 JPA리포지터리 인터페이스스프링 데이터 JPA에서 제공하는 리포지터리 인터페이스는 아래와 같은 구조를 가진다.1.최상위 Repository인터페이스는 아무런 기능이 없어 잘 사용하지 않음2.CrudRepository는 CRUD기능을 기본으로 제공3.PagingAndSortingRepository 인터페이스는 CrudRepository기능에 페이징 및 정렬 기능이 추가된 인터페이스입니다.4.스프링 데이터 JPA를 이용하려면 리포지터리 인터페이스를 기준으로 동적으로 실행할 수 있는 메서드를 생성해 준다.위와 같이 메서드의 이름에 따라 쿼리가 생성되는 부분을 쿼리 메서드라고 한다.쿼리 메서드는 find...By,read...By,query...By,count..by,get...by와 같이 시작하면 된다.예)findByTitle(String title); 이와 같이 메서드를 실행하면 JPQL(java Persistence Query Language)문이 실행된다. - 만약 2개이상의 속성을 조합하려면 And키워드를 사용한다. 예)findByTitleAndCountents(String title,String countents); 그 이외에도 아래와 같이 여러가지의 비교 연산자를 쓸수 있다.5.위와 같이 사용을 하면되지만 쿼리로 가져올려고 하다 보면 복잡하게 얽혀 있어서 메서드명이 점점 길어질수 있다. (예)findByLastnameAndfirstnameAndFirstnameIsAndObjectNameOrName......(끝없이....))이와 같이 복잡해 진다면 @Query어노테이션을 사용하여 쿼리를 직접 작성할수 있다.1.[?숫자]형식으로 파라미터를 지정. 순서대로 각각 ?1,?2에할당 된다.2.:[변수이름]으로 파라미터를 지정. 변수이름은 @Param어노테이션에 대응된다.위와같이 선언해서 사용할 경우에는 주의할 점이 있는데 FROM절에 데이터베이스의 테이블명이아니라 검색하려는 엔티티 이름을 사용한다는 부분을 주의해서 작업해야 한다. ※해당 JPA프로젝트를 실행하면 spring.jpa.generate-ddl옵션을 이용하여 해당하는 데이터베이스의 테이블이 자동생성 또는 변경이 된다. - 엔티티에 변화가 없으면 테이블 생성,변경을 하는 쿼리는 수행되지 않고 바로 애플리케이션이 실행된다.>생성한 로그2022-09-18 15:42:36,211 INFO [jdbc.sqlonly] create table t_jpa_board (board_idx integer not null auto_increment, contents varchar(255) not null, created_datetime datetime not null, creator_id varchar(255) not null, hit_cnt integer not null, title varchar(255) not null, updated_datetime datetime, updater_id varchar(255), primary key (board_idx)) engine=InnoDB2022-09-18 15:42:36,254 INFO [jdbc.sqlonly] create table t_jpa_file (idx integer not null auto_increment, created_datetime datetime not null, creator_id varchar(255) not null, file_size bigint not null, original_file_name varchar(255) not null, stored_file_path varchar(255) not null, updated_datetime datetime, updater_id varchar(255), board_idx integer, primary key (idx)) engine=InnoDB2022-09-18 15:42:36,262 INFO [jdbc.sqlonly] alter table t_jpa_file add constraint FK2nbe74xrl4gfj0wnqo1d6dk3l foreign key (board_idx) references t_jpa_board (board_idx)2022-09-18 15:42:37,990 INFO [board.BoardApplication] Started BoardApplication in 5.89 seconds (JVM running for 8.414)
2022. 08. 28.
0
[Spring Boot]10.REST Full API사용하기
※REST Full(REpresentational State Transfer) 잘 표현된 HTTP URI로 리소스를 정의하고 HTTP메서드로 리소스에 대한 행위를 정의합니다. 리소스는 JSON,XML과 같은 여러가지 언어로 표현할 수 있습니다.> 표현규칙URI는 명사를 사용해야한다. (예) DELETE /members/1)슬래시(/)로 계층 관계를 나타낸다.(예) GET /dogs/jindo)URI의 마지막에는 슬래시를 사용하지 않는다.URI는 소문자로만 작성한다.가독성을 높이기 위해 하이픈(-)을 사용할 수는 있지만 밑줄(_)은 사용하지 않는다.> 컨트롤러 규칙 - 위와 같이 일반적으로 쓰는 Spring URI는 insert나update를 명시하지만 REST API를 쓰게 되면 짧아지게되면서 쓰이게 된다. >기존에는 주소만 입력을 했지만RESTFul을 쓰게 되면 주소와 요청방법, 이 두가지 속성은 꼭 지정해야한다. - 기존 - RESTful API적용> 아래와 같이 요청방법은 여러가지로 되어있어서 선택해 주면 된다. > html에서 이동 및 수정/저장/삭제시 아래와 같이 form에 method설정을 해주면된다.html은 post,get만 지원이 되기때문에 put,delete와 같은 기능을 사용하기 위해서는 HiddenHttpMethodFilter를 사용해야한다.(HiddenHttpMethodFilter는 스프링2.1x이상 부터 적용되어있음) 수정,삭제 부분은 에 value값으로 지정을 해줘야한다.(해당 input값에 put값으로 지정해 주면 RequestMethod.PUT의 이름을 값을 가진 URI를 호출한다.) > 아래와 같이 REST API를 적용하려면 아래와 같이 @RestController를 사용하여 응답값만 받게끔 해준다.위와 같이 한 다음 포스트맨을 이용해 JSON형식으로 reuest,respon해 주는지 테스트해주면 된다.
2022. 08. 20.
0
[Spring boot]9.파일 업로드/다운로드 구현해 보기
※업로드 부분1.아래와 같이 build.gradle에 jar를 추가해 준다.2.그 후 아래와 같이 bean을 설정해 준다.3.html이나 jsp에 아래와 같이 enctype="multpart/form-data"와 file관련 input을 추가한다.4.사용할 controller에 아래와 같이 MultipartHttpServletrequest를 파라미터로 추가해 준다.5.아래와 같이 작성 후 파일이 제대로 전송되었는지 확인한다. - Iterator iterator= multipartHttpServletRequest.getFileNames(); 이 부분에서 getFileNames를 사용하게 되면 서버로 한꺼번에 전송되는 한개 이상의 파일 태그 이름을 이터레이터(Iterator)형식으로 가져올수 있다.(아래와 같이 2개 추출 가능) ※위와 같이 확인 되었으면 DB에 저장되게끔 아래와 같이 디렉토리 및 DB에 저장될 부분을 만들어준다.1.DTO생성2.파일 업로드는 공통적으로 쓰이기 때문에 아래와 같이 작성해 준다.3.공통을 만들었으면 아래와 같이 @Autowired로 선언 후 사용해 준다.4.위와 같이 등록하기 전에 아래와 같이 해당 게시물의 등록번호를 추출한다.useGeneratedKeys와 keyProperty를 선언함으로써 게시물의key값을 추출할수 있다.useGeneratedKeys : DBMS가 자동 생성키(mysql의 경우 Auto Increment)를 지원할 경우에 사용keyProperty는 useGeneratedKeys나 selectKey의 하위 엘리먼트에 의해 리턴되는 키를 의미한다. 게시물을 등록했으면 아래와 같이 파일정보도 저장하는 쿼리를 넣어준다.5.위와 같이 파일을 업로드를 하고 화면에 나타날 경우 아래와 같이 쿼리를 조회해 준다.6.가져오는 부분에서는 List로 받아주고 저장한 후 화면에 나타내면 된다. ※다운로드 부분 1.아래의 html과 같이 작성한다.2.service부분 추가3.serviceImpl부분 추가4.mapper부분 추가 - @Param을 사용하게 된다면 동적 마이바티스에서 Map형식으로 받을수 있다고 한다.5.xml에 sql쿼리를 추가한다.※다운로드 실행
2022. 08. 16.
0
[Sptring Boot]8.예외처리하기
스프링에서의 예외처리하는 방법은 크게 세가지가 있다.1.try/catch를 이용한 예외처리2.각각의 컨트롤러단에서 @ExceptionHandler를 이용한 예외처리3.@ControllerAdvice를 이용한 전역 예외처리1번은 java에서 사용하는 예외처리 방법이고,@ExceptionHandler의경우는 컨트롤러별로 동일한 예외처리를 추가해야되기때문에 중복되는 경우가 많아서 실용적이지 못하다. ※아래는 3번을 적용한 예외처리이다위의 클래스처럼 선언하면 아래와 같이 ExceptionHandler를 나타내고 화면도 예외 화면으로 이동한다.
2022. 08. 15.
0
[Spring Boot]7.트랜잭션 적용하기
트랜잭션이란 데이터 베이스의 상태를 변화시킬때 더이상 분리 할 수없는 작업의 단위.예를 들어 금융 거래시 아래와 같은 과정을 거칠때1.이체할 계좌선택2.이체하는 계좌에서 돈 출금3.이체 받는계좌에 돈 입금4.거래 정상완료이중에 2,3번에서 에러가 발생하면 1~4까지 하나의 트랜잭션에서 일련의 작업이 처리해야한다.트랜잭션을 설명할때는 ACID속성을 빠질수가 없다※ACID속성원자성(Atomicity) : 트랜잭션은 하나 이상의 관련된 동작을 하나의 작업단위로 처리.트랜잭션이 처리하는 작업 단위는 결과가 성공or실패할 경우에 관련된 동작은 모두 동일한 결과가 나와야 한다. 작업중 하나라도 실패한다면 관련된 트랜잭션 내에서 먼저 처리한 동작들도 모두 처음 상태로 되돌려야한다.일관성(Consistency) : 트랜잭션이 성공적으로 처리되면 데이터베이스의 관련된 모든 데이터는 일관성을 유지해야함.고립성(Isolation) : 트랜잭션은 독립적으로 처리되어야 하며 처리되는 중간에 외부에서의 간섭은 없어야 한다. 서로 다른 트랜잭션이 동일한 데이터에 종시 접근할 경우 적절한 동시 접근 제어를 해야한다.지속성(Durability) : 트랜잭션이 성공적으로 처리되면 그 결과는 지속적으로 유지 되어야 한다. 1.아래와 같이 개별적으로 트랜잭션을 설정할수 있음2.AOP를 이용하여 묶어서 트랜잭션을 설정한다. 2.아래와 같이 예외 발생할 경우 트랜잭션 처리를 한다.
2022. 08. 15.
0
[Spring Boot]6.AOP정리
※스프링 부트 시작하기 책에 있는 내용 정리1.AOP는 OOP(Object Oriented Programming:객체지향 프로그래밍)를 더욱 OOP답게 사용하도록 도와주는개념2.AOP는 관점지향 프로그래밍이라고 하는데 자신의 관점에서 보는것이 아닌 제3자가 보는 관점에서 바라본다고 생각하면 된다.3.AOP는 어떤 로직을 기준으로 핵심적인 관점,부가적인 관점으로 나눠서 보고 그 관점을 기준으로 각 모듈화를 하여 사용한다.※AOP에대한 용어를 정리관점(Aspect) : 공통적으로 적용될 기능을 의미한다. 횡단 관심사의 기능이라고 할수 있고, 한개이상의 pointcut과 advice의 조합으로 만들어진다.어드바이스(Advice) : 관점의 구현체로 조인 포인트에 삽입되어 동작하는 것을 의미한다. 스프링에서 사용하는 어드바이스는 동작하는 시점에 따라 다섯종류로 구분된다.조인포인트(joinpoint) : 어드바이스를 적용하는 지점을 의미한다. 스프링 프레임워크에서 조인포인트는 항상 메서드 실행 단계만 가능하다.포인트컷(pointcut) : 어드바이스를 적용할 조인포인트를 선별하는 과정이나 그 기능을 정의한 모듈을 의미 정규표현식이나 AspectJ의 문법을 이용해서 어떤 조인포인트를 사용할 것인지 결정타깃(Target) : 어드바이스를 받을 대상을 의미한다.위빙(weving) : 어드바이스를 적용하는 것을 의미한다. 즉, 공통 코드를 원하는 대상에 삽입하는 것을 뜻한다. ※어드바이스(Advice) 동작시점에 따른 다섯가지 종류Before Advice(@Before) : 대상 메서드가 실행되기 전에 적용할 어드바이스를 정의After returning Advice(@AfterReturning) : 대상 메서드가 성공적으로 실행되고 결과값을 반환한 후 적용할 어드바이스를 정의한다.After throwing Advice(@AfterThrowing) : 대상 메서드에서 예외가 발생 했을때 적용할 어드바이스를 정의한다. try/catch문의 catch와 비슷한 역할을 한다.After Advice(@After) : 대상 메서드의 정상적인 수행 여부와 상관없이 무조건 실행되는 어드바이스를 정의. 즉 예외가 발생하더라도 실행되기 때문에 자바의 finally와 비슷한 역할을 한다.Around Advice(@Around) : 대상 메서드의 호출 전후, 예외 발생등 모든 시점에 적용할수 있는 어드바이스를 정의한다. 가장 범용적으로 사용할 수 있는 어드바이스입니다.※PointCut(포인트컷)에 대한 명시자 정리excution : 가장 대표적이고 강력한 지시자로 접근 제어자, 리턴 타입 ,타입패턴 ,메서드,파라미터 타입,예외타입등을 조합해서 가장 정교한 포인트컷을 만든다.(예)select*)(..)은 0개이상의 파라미터,메서드,패키지등 모든것을 의미한다.사용예)excution(void select*(..))excution(* board.controller.*())excution(* board.controller.*(..))excution(* board..select*(*))excution(* board..select*(*,*))- 리턴타입이 void이면서 메서드 명이 select로 시작하며 파라미터가 0개 이상메서드- board패키지 밑에 파라미터가 없는 모든 메서드- board패키지 밑에 파라미터가 0개이상 모든 메서드- board패키지의 모든하위 패키지에 있는 select로 시작하고 파라미터가 한개인 모든 메소드- board패키지의 모든 하위 패키지에 있는 select로 시작하고 파라미터가 두개인 모든 메서드withub : 특정 타입에 속하는 메서드를 포인트컷으로 설정합니다.사용예)within(board.service.boardServiceImpl)within(board.service.*ServiceImpl)- board.service 패키지 밑에 있는 boardServiceImpl 클래스의 메서드가 호출 될때- board.service 패키지 밑에 있는 ServiceImpl이라는 이름으로 끝나는 메서드가 호출될때bean : 스프링의 빈 이름의 패턴으로 포인트 컷을 설정합니다.bean(boardServiceImpl)bean(*ServiceImpl)- boardServiceImpl이라는 이름을 가진 빈의 메서드가 호출 될때- ServiceImpl이라는 이름으로 끝나는 빈의 메서드가 호출 될때 1.아래와 같이 로그 출력시에 대한 AOP를 적용2.적용하면 아래와 같이 노출이 된다.
AOP
2022. 08. 15.
0
[Spring Boot]5.Interceptor 만들기
스프링의 인터셉터는 HandlerInterceptorAdapter클래스를 상속받아서 구현한다. 다음 3가지 메소드를 제공preHandle : 컨트롤러 실행 전에 수행한다.postHandle : 컨트롤러 수행 후 결과를 뷰로 보내기 전에 수행한다.afterCompletion : 뷰의 작업까지 완료 된 후 수행한다. ※아래와 같이 interceptor를 생성해 준다
2022. 08. 15.
0
[Spring Boot] 4.logback 설정하기
1.아래와 같이 logback-spring.xml을 생성2.아래와같이 셋팅해 준다.3.쿼리 로그를 정리하기 위해 아래와 같이 셋팅해 준다.4.tomcat을 실행하면 아래와 같이 정렬해서 나온다.
로그
2022. 07. 14.
0
[Spring boot]3.db설정 및 마이바티스 설정
1.아래와 같이 추가할 Dependencies를 설정한다. 2.application.properties에 db connect 셋팅을 한다.3.아래와 같이 database 연동하는 class를 생성한다.4.아래와 같이 마이바티스 설정을 한다.5.마이바티스 셋팅된 부분을 실행한다. 7.정상실행 확인 8.camel case(카멜)기법 적용 및 마이바티스 설정값 적용 - 아래와 같이 마이바티스 관련 설정을 적용한다.(현재 카멜기법만 적용)- 아래와 같이 마이바티스 설정 부분을 적용시켜 준다.
2022. 07. 14.
0
[spring boot]2.구조 파악하기
1.스프링 부트의 장점중 하나는 자동구성으로 기존의 복잡한 스프링 설정을 제거하고 최소한의 설정으로 바로 실행할수 있는 애플리케이션을 만들수 있다는것이 장점중 하나이다. - 기존 spring같은 경우 web.xml에 각 selvelt.xml 또는 application.xml에 관련 jar파일에 있는 클래스를 가져와서 bean에 셋팅을 했었는데 이제 어노테이션과 properties에 약속된 설정 값만 셋팅하더라도 길었던 코딩 줄을 줄일수 있다는 장점이 있음. ※앞에서 프로젝트를 생성하였으면 HomPageApplication.java 파일이 생성되어있을것이다.@SpringBootApplication은 스프링부트의 핵심 어노테이션으로 세개로 구성되어있다.1.@EnableAutoconfiguration : 스프링의 다양한 설정이 자동으로 완성된다.2.@ConponentScan:여러가지의 컴포넌트 클래스를 검색하고 검색된 컴포넌트 및 빈 클래스를 스프링 애플리케이션 컨텍스트에 등록하는 역할을 한다.3.@Configuration:해당 어노테이션은 @Springconfiguration이라는 어노테이션에 포함되어있는데 @Springconfiguration은 @SpringBootApplication에 포함이 되어있다. @Configuration은 자바기반의 설정파일임을 의미한다. ※gradle 설정
웹 개발
・
springboot