2021-03-11-TIL

Service in JPA

https://stackoverflow.com/questions/45329484/spring-data-jpa-repo-why-need-interface-service-and-service-implementation

https://stackabuse.com/guide-to-spring-data-jpa/

https://zetcode.com/springboot/annotations/

AWS

프리티어는 무료로 새로운 계정을 사용할 수 있다.


Lecture

Logger 사용 권고

  • System.out.println()은 안티패턴이다.
  • Logger.info 보다는 Logger.debug를 사용하는 것이 좀 더 낫다.

redirect, forward, 그냥 리턴

  • redirect:/user HTTP 302 요청 후 처리하고 이동, 주체는 브라우저
  • forward:user Servlet 서버가 user 컨트롤러를 호출한다. -> 안티패턴이다.
  • return "user"; controller -> model -> view

301은 캐싱이 된다. 우리가 필요한 것은 302이다. 주체는 항상 브라우저가 해준다!

setter가 없으면 컨트롤러에 값이 안 들어온다. getter가 없으면 view에 값을 못 전달한다. 롬복을 쓰면 알아서 getters and setters를 만들어줘버려서 돌아가는 원리를 잘 모르게된다.

ModelAndView 는 사용하지 않는 것이 낫다. 실제로 ModelAndView에 String을 추가해서 동작한다. 이는 구식적인 방법

사람 ->(http) 인터넷 ->(http) 엔진엑스 -> 톰캣(서블릿 컨테이너) -> 서블릿

JSP, 서블릿이 너무 어려움 -> J2EE가 나옴 -> 스트러츠가 나옴 -> 스프링

서블릿은 자바로 작성? HeadFirst servlet

DTO는 단순 맵핑하는 역할일 때는 안쓰는 것도 좋다.

Service도 굳이 별도로 분리할 필요가 없다.

findById().orElseThrow쓰는게 좋다. 그냥 userRepository.findById().get()은 하면 안된다.

Kaffeine은 사실 어뷰징이다..

curl -s -I http:/august-qna.herokuapp.com

curl http:/august-qna.herokuapp.com -I

를 쉘 스크립트로

* 9-22 * * * crontab /Users/august/heroku.sh >> log.txt 2>&1

crontab.guru에서 확인

자동 잔디밭 깔기 스크립트?

서비스는 보통 도메인 레이어에 속한다. 여러 계층에 걸쳐있는 로직이 있다면 서비스에 그냥 넣어도 될듯

도메인은 우리가 해결하고자 하는 문제의 범위 -> 홈쇼핑 구축 - 홈쇼핑이 도메인 -> 작게 쪼개면 하위도메인 - 회원가입 도메인, 결제 도메인, 배송 도메인, 포인트 도메인

인프라 - 도메인

students에 추가, 다음, 생성, .csv 다운로드

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788994506784

aws의 우분투 pw를 만들면 안된다. 이유는? 보안상 안 만드는게 낫다. pw로 들어오는것보다 key.pem파일이 안전하다.

맨앞단에 로드밸런서가 있다. aws에서는 그것을 ELB가 담당한다. data center가 두개 이상 필요한데, 하나는 AZ-a, AZ-b 서브넷을 네 개정도 만든다. EC2가 RDS를 서브로 갖고, s3를 미디어 서버로 쓴다. 일라스티카는 레디스를 쓴다. 세션디비에 해당한다. 여기에서 세션을 퍼주는 것을 세션 클러스터링 이라고 한다. 빅데이터 분석 등 다른 서비스를 쓰고 싶으면 aws에서 갖다쓰면 된다. 이미 만들어져 있기 떄문이다. 레고처럼 빌딩블락을 가져다 쓰는것

인스턴스 > 내 인스턴스 클릭 > public ipv4

8080포트는 원래 열면 안된다. ngix를 사용해서 앞에서 80으로 열어주고 일반 사용자는 80을 통해서만 갈 수 있어야한다.

​ 8 sudo apt install apache2 ​ 9 ls 10 apt install apache2 11 sudo apt install apache2 12 ls 13 sudo service apache2 status 14 curl http://localhost 15 ping exmaple.com 16 cd /etc/apche2 17 cd /etc/apache2/ 18 ls 19 cd /ecc/ 20 ls 21 cd /ec/ 22 cd /etc/ 23 ls 24 cd /var/www/ 25 ls 26 cd html/ 27 ls 28 rm index.html 29 pwd 30 ls -l 31 sudo rm index.html 32 sudo vi index.html 33 history

38 cd 39 git 40 git clone https://github.com/spring-boot-qna 41 git clone https://github.com/honux77/spring-boot-qna 42 ls 43 cd spring-boot-qna/ 44 ls 45 git switch honux77 46 ls 47 java 48 sudo apt install openjdk-8-jdk 49 sudo apt update 50 sudo apt install openjdk-8-jdk 51 java 52 javac 53 javac -version 54 ls 55 ./gradle build jar 56 ./gradlew build jar 57 ls 58 ls build/libs/ 59 java -jar build/libs/qna-0.0.1-SNAPSHOT.jar 60 ls 61 ./gradlew bootrun 62 history

ctrl + z and bg

EC2 -> S3 -> Spring 띄우기


미션2

PUT 메서드를 hidden필드에 추가하니 405에러 메서드를 처리할 수 없다는 에러 페이지가 뜬다. 그래서 application.properties에

spring.mvc.hiddenmethod.filter.enabled=true

이와 같은 설정을 추가해주거나, 다른 방법은 시도해보았지만 실패했다.

Entity의 디폴트 생성자 접근 제한

  • Question 엔티티에서 값을 전달하지 못하는 에러발생

    Question에서 생성자를 통해서 엔티티를 생성하도록 이미 생성자가 정의되어있다. 그런데 public으로 Question 생성자를 정의했더니, 값을 넘겨주지 못하고 null로 생성된 것을 확인했다. 그래서 protected로 생성자의 접근제한을 낮추었더니 우선순위가 변경되어서 기존에 멤버필드를 초기화해주는 생성자가 정상적으로 호출되어서 값이 잘 들어갔다.

  • https://www.yawintutor.com/unexpected-error-no-default-constructor-for-entity/
  • https://javarevisited.blogspot.com/2014/01/why-default-or-no-argument-constructor-java-class.html#axzz6oosGs5gc

What is service layer role in Spring Boot

  • https://stackoverflow.com/questions/58234187/what-is-the-use-of-service-layer-in-spring-boot-applications#:~:text=A%20Service%20Layer%20defines%20an,the%20implementation%20of%20its%20operations.
  • https://medium.com/stackavenue/why-to-use-service-layer-in-spring-mvc-5f4fc52643c0

ResponseStatusException

ResponseStatusException usage has few benefits:

  • Firstly, exceptions of the same type can be processed separately and different status codes can be set on the response, reducing tight coupling
  • Secondly, it avoids the creation of unnecessary additional exception classes
  • Finally, it provides more control over exception handling, as the exceptions can be created programmatically

https://www.baeldung.com/spring-response-status-exception

public boolean matchPassword(User user) {
    return password.equals(user.password);
}

엔티티에 이것 하나 추가했다고 갑자기 404에러가 뜬다. 즉, 뷰를 받아오지 못한다. 무엇이 문제일까?

한번씩 서버가 완전히 종료되지 않았거나 완전히 실행되지 않았을 때 접속하려고하면 DB데이터를 초기화하고 받아오지 못하는 것 같다.


개발자 언어 사전

  • 안티 패턴 : 코드 상에서 오류날 가능성이 큰 문제가 있는 코드이다.
  • 삽질 : 보통 환경구축이나 디버깅 등 뭐가 안되는지 잘 모를때 그것을 알아내기 위해서 부단한 노력을 하는 것을 가리킨다.
  • 인사이트 : 한 분야에서 계속 꾸준히 노력하다 보면 얻어지는 노하우, 보통 특정 패턴이 반복되면 그것을 통해서 구조화된 해결책이 생겨나는데, 그것을 보고 ‘인사이트를 얻었다'라고 표현한다.

TODO: Adapt @Column

TODO: include service logic in Services