상세 컨텐츠

본문 제목

스프링 부트로 시작하는 웹 서비스_3

JSP·자바·코틀린

by 김일국 2021. 8. 11. 18:23

본문

### 작업한 소스 깃 : https://github.com/miniplugin/kimilguk-springboot2

### 작업결과 배포 클라우드헤로쿠 : https://kimilguk-springboot2.herokuapp.com/

지난 포스트에 이어서, 어느정도 분석이 마쳤습니다.

이제 신규로 스프링부트2 프로젝트를 만들어 보겠습니다.

인텔리J 커뮤니티버전(무료)에서는 없는 spring initializr 사용을 합니다.(온라인 zip 파일만들기 아래URL)

https://start.spring.io/#!type=gradle-project

빌드툴: Gradle, 언어: Java, Sptring Boot버전: 2.4.10(릴리즈버전), Group, Artifact, Name(공백), Descript, Package name

Packaging: Jar, Java버전: 8, 화면 오른쪽에서 확장모듈(라이브러리): lombok 추가 후 마지막으로 하단 GENERATE 버튼 클릭 하면, zip 파일을 받게 됩니다. 압축 풀고, 인텔리J 커뮤니티버전에서 open 이후 프로젝트 신규 진행

프로젝트 로딩시 빌딩 속도가 이클립스때보다 느리다면, 아래 처럼 셋팅해 주면, 프로젝트가 빨리 열립니다.(아래)

기술참조: https://atoz-develop.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-Spring-Initializr-%EC%9B%B9-%EB%8F%84%EA%B5%AC-%EC%82%AC%EC%9A%A9

위 설정결과: gradle build 시에는 build 폴더에, IntelliJ 에서 빌드시에는 out 폴더에 빌드된 class 파일이 생성되게 된다.

인텔리J IDEA로 빌드 및 실행시 아래와 같은 에러가 나올 수 있다.

...기본 클래스 com.edu.springboot2.Application을(를) 찾거나 로드할 수 없습니다.

위와 같은 메시지가 나올때는, 다시 Gradle로 변경하고 실행하시면 됩니다. 아무래도 그래들이 안정적인 실행을 보장하는 듯 합니다.

인텔리J에서 실행할때(아래)

터미널 CMD 창에서 실행할때는 Gradle로 빌드 및 실행할때(아래)

터미널에서 프로젝트 루트 디렉토리로 이동 후 다음 명령어를 입력한다. (Windows는 gradlew.bat)

 $ ./gradlew build

빌드가 완료되면 ./build/libs 디렉토리에 jar 파일이 생성된다. java -jar로 실행한다.

$ java -jar {생성된 jar파일명}.jar

### 스프링부트 에서 MVC
- 참고 스프링레거시 에서 MVC는 아래와 같습니다. 비교해 보시기 바랍니다.
- 스프링레거시 예: DB테이블 -> 모델(매퍼쿼리>@Repository인터페이스=DAO클래스) -> 서비스(@Service) -> 컨트롤러클래스 -> (JSP|타임리프,타일즈템플릿)
- 모델domain(구성:@Entity클래스 와 JpaRepository인터페이스) -> 서비스(@Service) -> 컨트롤러(구성:@Controller+DTO클래스) -> (타임리프,머스테치템플릿)
- @Entity클래스 : 데이터베이스 테이블을 자동생성 및 구현메서드(@Builder인터페이스사용) 추가.
- JpaRepository인터페이스 : 형식: JpaRepository<Entity 클래스, PK 타입> 기능: CRUD기본 쿼리 자동생성.
- 서비스(@Service) : 인터페이스 없이 사용.(, 레포지토리는 인젝션으로 사용하지 않아도 롬복 @RequiredArgsConstructor 으로 사용가능.
- 서비스 예, private final PostsRepository postsRepository;
- DTO(Data Transfer Object)클래스 : 스프링레거시의 VO와 같이 데이터 전송 임시 저장소로 Get/Set 역할을함.
- Mustache(머스테치)템플릿 : 템플릿 코드(, {{userName}})로 자바 변수와 객체를 사용함.(JSTL과 타임리프,타일즈 대신사용)
- 작업순서예, 1. Requet 데이터임시저장 Dto, 2. API 요청을 받을 Controller, 3.서비스로 DAO호출, 4. 도메인작업(엔티티+레포지토리인터페이스)
- mustache 템플릿은 앱을 리스타트 해야지만 적용이 됩니다.
- Lombok을 사용하면 생성자도 자동으로 생성할 수 있습니다.
- @NoArgsConstructor 어노테이션은 파라미터가 없는 기본 생성자를 자동으로 생성해주고,
- @AllArgsConstructor 어노테이션은 모든 필드 값을 파라미터로 받는 생성자를 자동으로 만들어줍니다.
- *가장중요 @RequiredArgsConstructor 어노테이션은 final 이나 @NonNull 인 필드 값만 파라미터로 받는 생성자를 자동으로 만들어줍니다.
- sql 쿼리 확인하기.(아래)
- https://velog.io/@dnjscksdn98/Spring-Data-JPA-H2-Console-%EB%B0%8F-%EB%A1%9C%EA%B9%85-%EC%84%A4%EC%A0%95
- 인텔리J 에서 .properties 파일의 한글이 깨질때 설정방법(아래 화면 처럼 선택 체크 처리)

### 스프링 레거시와 스프링부트의 폴더 구조차이
- 스프링레거시 폴더구조: [pom.xml], [WEB-INF>web.xml],[WEB-INF>spring>root-context.xml,WEB-INF>appServlet>servlet-context.xml]
- 스프링레거시 폴더구조: roo최상위 > [controller, dao(src/main/reousrces/mappers쿼리), service, vo ]
- 스프링부트 폴더구조: roo최상위 > [build.gradle], [Application.java] > [config], [domain, service, web>dto ]

### 20210813() 작업예정
- 회원관리 기능 CRUD 추가(admin 관리자 ROLE_ADMIN 에서 회원등록 권한 추가)
- 게시판 첨부파일 기능 추가

### 20210812() 작업
- 회원관리 기능 CRUD 추가(admin 관리자 ROLE_ADMIN 에서 회원등록 권한 추가)
- [domain 폴더에 simple_users 패키지] 생성.
- [@Entity] SimpleUsers.java 클래스 생성.(앱 실행시 SIMPLE_USERS 테이블 자동생성 jpa 기능)
- @Entity 클래스에 빌더패턴으로 Setter 에 사용할 생성자매서드 추가.
- SimpleUsersRepository.java 기능 [JpaRepository 인터페이스 쿼리메서드] 추가.
- [web > dto 폴더]SimpleUsers.Dto [DTO](VO, 전송데이터 임시저장)기능 추가.
- [service 폴더에 simple_users 패키지] 생성.
- SimpleUsersService.java [@Service] 기능 추가.
- [web 폴더] SimpleUsersController.java [@Controller 클래스] 추가.
- [resources > templates > simple_users 폴더]에 머스태치 jsp 파일 추가.
- list.mustache 까지 작업.

- 머스태치 기술정보: https://m.blog.naver.com/nuberus/221884812398

 

### 20210811() 작업
- Spring Boot: 시큐리티(Security) – 3 – 로그인 및 권한 정보를 DB에서 가져오기
- 회원 DB 에서 로그인 연동하기 : http://yoonbumtae.com/?p=1202
- 메모리에 하드코딩된 권한 정보를 데이터베이스에 옮겨서 가져오도록 처리.
- 스프링 암호화 값 만들기: https://www.browserling.com/tools/bcrypt (암호: 1234, ROUND: 12)
- @Entity SimpleUsers.java 생성 후 초기 값 import.sql resources 폴더에 넣고 쿼리가 자동 실행 되게 함.

### 20210810() 작업
- 로깅레벌 설정: https://programmer93.tistory.com/46
- TRACE < DEBUG < INFO < WARN < ERROR
- 예를 들어 로깅 레벨 설정을 "INFO"로 하였을 경우 "TRACE", "DEBUG" 레벨은 무시한다.
- private: 다른 클래스에서 사용하지 못하도록.
- static: 인스턴스당 하나만 사용하겠다고 명시.
- final: 내용을 변경하지 않겠다고 명시.
- Spring Boot: 시큐리티(Security) – 2 – 커스텀 로그인 페이지 만들기 참조: http://yoonbumtae.com/?p=1184
- /login 기존 자동 생성된 소스를 개발자가 커스터마이징 해서 생성하기 마무리.
- SecurityConfig 클래스에 폼로그인 메서드 추가: formLogin()
- indexController 클래스에 추가: if(user == null && principal != null) { //일반 로그인 일때 세션 저장
- 빌더형 생성자 메서드에 데이터를 입력하는 방법(Serializable 사용안함. 아래처럼 메서드를 체이닝 사용 = 빌더패턴)
```java
//User user_local = new User(userName,"","",Role.USER);//Serializable 에러
/*
User user_local = User.builder()
.name(userName)
.email("")
.picture("")
.role(Role.USER)
.build();
*/
```
- 일반 로그인 성공: 메모리 인증 사용
- 권한 정보를 inMemoryAuthentication 란 매서드를 이용해서 메모리에 하드코딩 해서 사용처리.
- 위 작업을 컨트롤러에서 LoginUserArgumentResolver.java 로 변경 = 공통코드 처리: 기술참조(아래)
- http://chomman.github.io/blog/spring%20framework/spring-security%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EC%82%AC%EC%9A%A9%EC%9E%90%EC%9D%98-%EC%A0%95%EB%B3%B4%EB%A5%BC-%EC%B0%BE%EB%8A%94-%EB%B0%A9%EB%B2%95/

### 20210809() 작업
- Spring Boot: 시큐리티(Security) – 1 참조: http://yoonbumtae.com/?p=764
- 네이버로그인 말고, 일반 회원 로그인 기능 추가
- /login 기존 자동 생성된 소스를 개발자가 커스터마이징 해서 생성하기.(참조: http://yoonbumtae.com/?p=2872)
- SecurityConfig.java 에서 http는 내장된 대다수의 메서드들이 http 객체 자신을 반환하기 때문에
- 제이쿼리의 처럼 메서드를 체이닝 하여 사용(빌더패턴)할 수 있습니다.

### 20210808() 작업
- [05] 4. 세션 저장소로 데이터베이스 사용하기
- 4.1. spring-session-jdbc 등록
- JUnit 테스트에서 CRUD 가능하게 처리

### 20210807() 작업
- DTO OAuthAttributes.java 클래스 소스코드 해석.(OAuthAttributes of(...) 핵심)
- 시프링시큐리티설정에 지정된 CustomOAuth2UserService 클래스의 loadUser 가 실행되면, 인증받은 반환값을 처리하게 된다.

### 20210806() 작업
- [05 스프링시큐리티와 OAuth2.0으로 로그인]
- 스프링 시큐리티 사전 정보: https://velog.io/@jayjay28/2019-09-04-1109-%EC%9E%91%EC%84%B1%EB%90%A8
- 2.구글 로그인 연동하기 시작
1. User @엔티티 도메인클래스+Role 열거형권한 Enum+UserRepository(내장 CRUD 자동메서드) 인터페이스셩성
2. 소셜 로그인 코드를 작성: config.auth 패키지에 SecurityConfig 스프링 시큐리티클래스 + CustomOAuth2UserService 소셜로그인클래스를 생성한다.
3. CustomOAuth2UserService 에서 소셜로그인 처리 후 가져온 객체를 세션애 저장할 DTO 객체클래스인 SessionUser(Serializable 상속) 클래스를 생성한다.
4. 위 서비스 클래스 loadUser() 에서 세션을 발생 시킨다. httpSession.setAttribute("user", new SessionUser(user));
5. CustomOAuth2UserService 클래스에서 사용될 saveOrUpdate(OAuthAttributes attributes) =OAuthAttributes DTO 클래스를 생성합니다.
6. OAuthAttributes DTO 클래스는 반환받은 사용자 정보를 분해(파싱)하는 역할을 합니다.
7. 인증된 사용자 정보 클래스인 SessionUser DTO 클래스를 생성합니다.
8. indexContorller 클래스 model 객체 추가 및, index.mustache 로그인 버튼 수정
9. Session user = (SessionUser) httpSession.getAttribute("user"); -> 메서드 매개변수로 처리 @LoginUser SessionUser user
10. 위 처리를 위해서 애노테이션 파일 LoginUser 생성 및 메서드 파라미터로 사용하기 위한 LoginUserArgumentResolver 클래스 생성
11. Resolver 클래스를 스프링 에서 인식시키도록 @Configuration 클래스인 WebConfig.java 생성

### 20210805() 작업
- 1.5. 게시글 수정, 삭제 화면 만들기
- @Service 클래스에서는 2가지 작업을 실행하게 됨(1. ApiRepository 인터페이스에서 CRUD 실행 2. @Entity 클래스에서 CRUD)

### 20210804()
- [04 머스테치템플릿으로 화면 구성하기]
- 스프링 레거시와 마친가지로 스프링부트도 기능추가시 외부모듈 라이비러리를 추가해야 합니다.
- 스프링 레거시 pom.xml 대신에 스프링부트는 build.gradle 로 의존성 모듈을 추가 합니다.
- 작업순서: mustache파일 -> @Controller+dto클래스 -> @Service -> Repository+@Entity클래스

### 20210803()
- [03 스프링부트에서 JPA로 데이터베이스 다루기]까지 작업됨.

### 20210802()
- assertThat(조건): JUnit 에서 정해진 조건에 맞지 않을 때(false) 프로그램을 중단합니다

### 20210801()
- 스프링시큐리티 권한(ROLE_USER, ROLE_GUEST) 확인파일 5(아래실행순서)
- config.auth폴더(CustomOAuto2UwerService.java:saveOrUpdate()메서드)
- config.auth.dto폴더(OAuthAttributes.java:toEntity()메서드)
- domain.user폴더(User.java:User()메서드)
- domain.user폴더(Role.java:USER()메서드)

### 20210731()
- 그래들(외부모듈)설정파일: build.gradle 확인
- VCS->Import Into Version Control->Create Git Repository 로 로컬 깃 생성
- 깃허브에 레포지토리 생성 후 깃 주소 복사 (https://github.com/kimilguk/kimilguk-springboot2.git)
- commit 과 푸시 모두 실행
- 참고: 인텔리J 인덱싱 기능을 끄기: https://jootc.com/p/202001243264

### 20210730()
- 인텔리J 커뮤니티(무료)버전은 스프링 프로젝트를 지원하지 않는다. 아쉽지만, 플러그인 설치로 스프링부트를 사용할 수 있다.(아래)
- https://www.jetbrains.com/idea/features/editions_comparison_matrix.html
- 인텔리J 커뮤니티(무료)zip버전 으로 압축해제 후 사용: https://www.jetbrains.com/ko-kr/idea/download/#section=windows
- 인텔리J 한글 인코딩 설정 추가: https://goddaehee.tistory.com/248
- 기존소스 분석 및 작업한 결과 깃과 연동OK.
- 헤로쿠와 연동 Procfile 메이븐에서 그래들빌드용으로 변경(아래).
- web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/kimilguk-springboot2-1.0.3-SNAPSHOT-20210730151335.jar

관련글 더보기

댓글 영역