[책 읽기]

 블로그 - 기억보다 기록을

 깃허브 - http://bit.ly/fr-springboot

 


 * 이 책에서 개선하려고 한 포인트

* 코드
 - DB에 들어갈 date 필드 처리방식
 - Setter 메서드로 도배된 Entity 클래스들
 - @Autowired로 도배된 Spring DI 코드
 - System.out.println()으로 이루어진 테스트 코드

* 운영 환경
 - 배포된 서버와의 DB연결
 - 배포 서버의 리눅스 기본 설정
 - DB의 여러 설정들
 - 직접 CI/CI 환경을 구축하는 방법
 - 무중단 서비스를 위한 배포 방법
 - Nginx의 설치 및 설정
 - AWS RDS 필수 설정
 - AWS EC2의 Security Group, EIP 등 기본설정
 - Travis CI의 기본 설정

 


  • 따로 알아봐야 할 내용들
    • Eclipse와 intelliJ 중 Java 개발에 더 좋은 것에 대한 의견
    • IntelliJ 사용방법 및 단축키
    • mavenCentral, jcenter
    • 빌드 도구, Gradle, maven 차이점
    • TDD, DDD
    • lombok
    • assertJ
    • ORM, SQL Mapper 구분
    • JPA dirty Checking
    • JPA Auditing, JDK 8 이전의 Date와 Calendar 클래스의 문제점, 그리고 개선된 LocalDate
    • JPA, Hibernate, Spring Data JPA의 관계
    • Spring Data Jpa를 이용하여 관계형 데이터베이스를 객체지향적으로 관리하는 방법
    • 서버 템플릿 엔진과 클라이언트 템플릿 엔진
    • 서버 사이드 렌더링, 클라이언트 사이드 렌더링
    • 템플릿 엔진 종류 및 차이점
    • 스프링 부트 및 모듈 사용 시 기본 폴더 경로
    • CDN

 


 * 정리본

2020/05/27 - [Edu/SpringBoot] - [SpringBoot] IntelliJ에서 SpringBoot시작하기

2020/05/27 - [Edu/SpringBoot] - [SpringBoot] UnitTest 환경 만들기

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] lombok 설정 및 테스트

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] Spring Data JPA 설정

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] 설정파일 yaml로 변경하기

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] Posts API 만들기

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] JPA Auditing

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] Mustache

2020/05/29 - [Edu/SpringBoot] - [SpringBoot] 게시글 등록

2020/05/29 - [Edu/SpringBoot] - [SpringBoot] 게시글 전체 조회

2020/05/29 - [Edu/SpringBoot] - [SpringBoot] 게시글 수정

2020/05/29 - [Edu/SpringBoot] - [SpringBoot] 게시글 삭제

2020/05/31 - [Edu/SpringBoot] - [SpringBoot] Spring Security & OAuth 2.0 로그인

2020/05/31 - [Edu/SpringBoot] - [SpringBoot] OAuth2 Google Login

2020/05/31 - [Edu/SpringBoot] - [SpringBoot] 로그인 & 포스팅 권한 테스트

2020/05/31 - [Edu/SpringBoot] - [SpringBoot] 어노테이션 기반 세션 처리 ArgumentResolver

2020/06/01 - [Edu/SpringBoot] - [SpringBoot] 세션 저장소로 DB이용하기

2020/06/01 - [Edu/SpringBoot] - [SpringBoot] OAuth2 Naver Login

2020/06/02 - [Edu/SpringBoot] - [SpringBoot] 기존 테스트에 시큐리티 적용

 


 

 * 정오표를 통해 책에 의도대로 따라가기

Git 정오표

 

 * 이 책은 JDK 1.8Gradle 4.8을 기준으로 작성되었다는 것을 확인 해야 함

 * 내 프로젝트 생성 시 환경을 맞추고 시작해야 책에서 의도한 대로 따라갈 수 있음

 * 책 대로 했는데 안되면 "나는 이길이 아닌가보다" 라는 생각을 갖게 됨..

 * 서비스 로직 구현할 때 dto -> Service -> Controller 순으로 따라하는게 이해가 쉬움

 

p.71 lombok Issue

intelliJ 설치 시 Gradle 5버전으로 사용되고 있어서 Gradle 4다운드레이드 필요

 

[Gradle 버전 확인하기 gradle-wrapper.properties]

 

Gradle 이슈 대처 방법

 

요약: 현재 프로젝트의 Terminal을 열어 아래 명령어를 복사해서 붙이면 Gradle 다운그레이드할 수 있음

gradlew wrapper --gradle-version 4.10.2

 

p.100 PostsApiController.save() Test Issue

save메서드를 보면 @putMapping(...)라고 되어 있는데 내용을 보면 Post 내용이기 때문에 @PostMapping으로 변경

 

 

 

 

 

p.111 PostsApiController.update() 취소 기능 Issue

PostsUpdateRequestDto 클래스 작성

 

 

 

 

 

Posts 클래스 내에 update() 작성

 

 

 

 

 

p.176 .ignore 파일에 application-oauth.properties 제외 했는데도 commit 할 때 계속 뜨는 경우

application-oauth.properties 파일이 이미 tracked 되고 있는 상태에서
.ignore 파일을 업데이트 할 경우 제대로 적용이 안되고
commit할 때 계속 나오는 경우가 존재한다.
해결책은 캐시를 비워 .ignore 파일이 제대로 적용되도록 한다.

 

 

 

 

 

p.194 권한 변경 후 글 등록 시

1. Application 실행
2. OAuth를 이용하여 구글 로그인 ( h2에 데이터가 들어가는 시점 )
3. h2-console에서 권한 수정 udate usr set rold = "USER"; ( 이때 세션에는 아직 GUEST로 저장되어 있음 )
4. 세션 정보를 최신화 시키기 위해서 로그아웃 후 다시 로그인해서 게시글 등록 시도

 

p.326 Travis CI .travis.yml 설정 후 build 이슈

./gradlew: Permission denied git에 permission을 업데이트 해줘야 travis가 실행할 수 있다.

 

 

 

 

 

.travis.yml에 before_install을 추가하여 permission을 바꾸는 방법

 

 

 

 

 

Git update를 통해 직접 permission을 바꾸는 방법

 

 

 

 

 

p. 338 S3 region 확인

AWS S3 대시보드 -> 생성한 bucket 클릭 -> 속성 -> 정적 웹 사이트 호스팅 클릭 시 엔드 포인트에서 확인 가능

 

p. 394 무중단 배포 테스트 후 게시물 등록 테스트

오류가 당연한 것이 security에서 처음 로그인한 상태가 GUEST이기 때문이다. USER로 변경 해줘야 게시물 등록을 할 수 있다.

 

 


[구현 설계]

  • @GetMapping("/") String index(Model model, @LoginUser SessionUser user)

String index(Model model, @LoginUser SessionUser user)

  • @PostMapping("/api/v1/posts") Long save(PostsSaveRequstDto)

Long save(PostsSaveRequstDto)

  • @GetMapping("/api/v1/posts/{id}") PostsResponseDto findById(Long id)

PostsResponseDto findById(Long id)

  • @PutMapping("/api/v1/posts/{id}") Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto)

Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto)

 

  • @DeleteMapping("/api/v1/posts/{id}") Long delete(@PathVariable Long id)

Long delete(@PathVariable Long id)

 

'' 카테고리의 다른 글

[책] 자바 성능 튜닝 이야기  (0) 2019.07.07

Step 01. 디자인 패턴, 꼭 써야 한다.

 - J2EE 패턴

 - Transfer Object 패턴

 - Service Locator 패턴

 

Step 02. 내가 만든 프로그램의 속도를 알고 싶다.

 - 프로파일링 툴이란?

 - System 클래스

 - System.currentTimeMillis와 System.nanoTime

 

Step 03. 왜 자꾸 String을 쓰지 말라는거야?

 - String 클래스를 잘못 사용한 사례

 - StringBuffer 클래스와 StringBuilder 클래스

 - String vs StringBuffer vs StringBuilder

 - 버전에 따른 차이

 

Step 04. 어디에 담아야 하는지...

 - Collection 및 Map 인터페이스의 이해

 - Set 클래스 중 무엇이 가장 빠를까?

 - List 관련 클래스 중 무엇이 빠를까?

 - Map 관련 클래스 중에서 무엇이 빠를까?

 - Collection 관련 글래스의 동기화

 

Step 05. 지금까지 사용하던 for 루프를 더 빠르게 할 수 있다고?

 - 조건문에서의 속도는?

 - 반복 구문에서의 속도는?

 - 반복 구문에서의 필요없는 반복

 

Step 06. static 제대로 한번 써 보자

 - static의 특징

 - static 잘 활용하기

 - static 잘못 쓰면 이렇게 된다.

 - static과 메모리 릭

 

Step 07. 클래스 정보, 어떻게 알아낼 수 있나?

 - reflection 관련 클래스들

 - reflection 관련 클래스를 사용한 예

 - reflection 클래스를 잘못 사용한 사례

 

Step 08. synchronized는 제대로 알고 써야 한다

 - 자바에서 스레드는 어떻게 사용하나?

 - interrupt() 메서드는 절대적인 것이 아니다.

 - synchronized를 이해하자

 - 동기화는 이렇게 사용한다 - 동일 객체 접근 시

 - 동기화는 이렇게 사용한다 - static 사용 시

 - 동기화를 위해서 자바에서 제공하는 것들

 - JVM 내에서 synchronization은 어떻게 동작할까?

 

Step 09. IO에서 발생하는 병목 현상

 - 기본적인 IO는 이렇게 처리한다.

 - IO에서 병목이 발생한 사례

 - 그럼 NIO의 원리는 어떻게 되는 거지?

 - DirectByteBuffer를 잘못 사용하여 문제가 발생한 사례

 - lastModified() 메서드의 성능 저하

 

Step 10. 로그는 반드시 필요한 내용만 찍자

 - System.out.println()의 문제점

 - System.out.format() 메서드

 - 로그를 더 간결하게 처리하는 방법

 - 로거 사용 시의 문제점

 - 로그를 깔끔하게 처리하게 도와주는 slf4j와 LogBack

 - 예외 처리도 이렇게

 

Step 11. JSP와 서블릿, Spring에서 발생할 수 있는 여러 문제점

 - JSP와 Servlet의 기본적인 동작 원리는 꼭 알아야 한다.

 - 적절한 include 사용하기

 - 자바 빈즈, 잘 쓰면 약 못쓰면 독

 - 태그 라이브러리도 잘 써야 한다.

 - 스프링 프레임워크 간단 정리

 - 스프링 프레임워크를 사용하면서 발생할 수 있는 문제점들

 

Step 12. DB를 사용하면서 발생 가능한 문제점들

 - DB Connection과 Connection Pool, DataSource

 - DB를 사용할 때 닫아야 하는 것들

 - JDK 7에서 등장한 AutoClosable 인터페이스

 - ResultSet.last() 메서드

 - JDBC를 사용하면서 유의할 만한 몇 가지 팁

 

Step 13. XML과 JSON도 잘 쓰자

 - 자바에서 사용하는 XML 파서의 종류는?

 - SAX 파서는 어떻게 사용할까?

 - DOM 파서는 어떻게 사용할까?

 - XML 파서가 문제가 된 사례

 - JSON과 파서들

 - 데이터 전송을 빠르게 하는 라이브러리 소개

 

Step 14. 서버를 어떻게 세팅해야 할까?

 - 설정해야 하는 대상

 - 아파치 웹 서버의 설정

 - 웹 서버의 Keep Alive

 - DB Connection Poll 및 스레드 개수 설정

 - WAS 인스턴스 개수 설정

 - Session Timeout 시간 설정

 

Step 15. 안드로이드 개발하면서 이것만은 피하자

 - 일반적인 서버 프로그램 개발과 안드로이드 개발은 다르다.

 - 구글에서 이야기하는 안드로이드 성능 개선

 - 안드로이드 분석에 도움이 되는 기본적인 툴들

 - 안드로이드 앱의 상황을 확인하는 방법은?

 - systrace를 활용하자

 - 안드로이드에서는 이미지 처리만 잘해도 성능이 좋아진다.

 

Step 16. JVM은 도대체 어떻게 구동될까?

 - HotSpot VM은 어떻게 구성되어 있을까?

 - JIT Optimizer라는 게 도대체 뭘까?

 - JRockit의 JIT 컴파일 및 최적화 절차

 - IBM JVM의 JIT 컴파일 및 최적화 절차

 - JVM이 시작할 때의 절차는 이렇다

 - JVM이 종료될 때의 절차는 이렇다

 - 클래스 로딩 절차도 알고 싶어요?

 - 예외는 JVM에서 어떻게 처리될까?

 

Step 17. 도대체 GC는 언제 발생할까?

 - GC란?

 - 자바의 Runtime data area는 이렇게 구성된다

 - GC의 원리

 - GC의 종류

 - 5가지 GC 방식

 - 강제로 GC 시키기

 

Step 18. GC가 어떻게 수행되고 있는지 보고 싶다.

 - 자바 인스턴스 확인을 위한 jps

 - GC 상황을 확인하는 jstat

 - jstat 명령에서 GC 튜닝을 위해서 가장 유용한 옵션은 두 개

 - 원격으로 JVM 상황을 모니터링하기 위한 jstatd

 - verbosegc 옵션을 이용하여 gc 로그 남기기

 - 어설프게 아는 것이 제일 무섭다

 

Step 19. GC 튜닝을 항상 할 필요는 없다.

 - GC 튜닝을 꼭 해야 할까?

 - GC의 성능을 결정하는 옵션들

 - GC 튜닝의 절차

 - 1, 2 단계: GC 상황 모니터링 및 결과 분석하기

 - 3-1 단계: GC 방식 지정

 - 3-2 단계: 메모리 크기

 - 4 단계: GC튜닝 결과 분석

 

Step 20. 모니터링 API인 JMX

 - JMX란?

 - MBean에 대해서 조금만 더 자세히 알아보자

 - Visual VM을 통한 JMX 모니터링

 - 원격으로 JMX를 사용하기 위해서는...

 

Step 21. 반드시 튜닝해야 하는 대상은?

 - 반드시 튜닝해야 하는 대상 선정

 - 왜 로그인 화면을 튜닝(분석)해야 하는가?

 - 쇼핑몰 사이트에서는...

 

Step 22. 어떤 화면이 많이 쓰이는지 알고 싶다

 - 웹 로그란?

 - 웹 로그를 통해서 접근 통계를 분석하기 싫다면?

 

Step 23. 튜닝의 절차는 그때그때 달라요

 - 성능 튜닝을 위한 아주 기초 법칙

 - 성능 튜닝 Step By Step

 - 성능 튜닝의 비법

 

Step 24. 애플리케이션에서 점검해야 할 대상들

 - 패턴과 아키텍처는 잘 구성되어 있는가?

 - 기본적인 애플리케이션 코딩은 잘 되어 있는가?

 - 웹 관련 코딩은 잘 되어 있는가?

 - DB 관련 코딩은 잘 되어 있는가?

 - 서버의 설정은 잘 되어 있는가?

 - 모니터링은 어떻게 하고 있는가?

 

 

 

+ Recent posts