Web

[1028 코딩] 코딩팁 모음

DRY  WET  KISS  YAGNI

DRY  Don't Repeat Yourself
WET Write Everything Twice
KISS Keep It Simple, Stupid: SImplicity should be a key goal  by kelly johnson
 - Code, Function Class, View, Service, System<
YAGNI You Ain't Gonna Need It Right Feature, Built right   => cost of carry 
Right feature, Built Wrong                                  => Cost of Delay , cost of repair
Wrong featrue                                                 => cost of building
필요하지 않은 기능, 사용하지 않는 기능, 지나치게 미래 지향적인거 쓰지 않는다.  

드림코딩/엘리 /코딩 잘하는 팁 세가지 (이걸 알면 코드가 깔끔해 진다) youtu.be/jafa3cqoAVM

연봉 & 성장 & 기술 의 공통점이 늘어나도록

드림코딩/엘리/ 개발 경력관리 끝장판 🚀 (커리어 관리 노하우)youtu.be/E9_foa4z1iQ

 

테스트 100% 커버리지 방법, 개선 과정. 

토스ㅣSLASH 21 - 테스트 커버리지 100%youtu.be/jdlBu2vFv58

 

redirect vs forward

  Redirect  Forward 
URL변화 URL 변화있음 URL 변화 없음
자원공유 자원공유불가 Web Container의 내부에서 이동하기 때문에 request와 response 객체를 공유
      @GetMapping("/")
    public RedirectView home() throws IOException {
        return new RedirectView("diary/add");
    }  

    @GetMapping("/")
    public ModelAndView home() {
        return new ModelAndView("redirect:diary/add");
    }
    @GetMapping("/")
    public ModelAndView home() {
        return new ModelAndView("forward:diary/add");
    }

출처 : nesoy.github.io/articles/2018-04/Redirect-Forward

 

lombok

@Getter @Setter  
@NoArgsConstructor / @AllArgsConstructor 기본생성자 / 모든필드생성자
@RequiredArgsConstructor 필수값생성자
@ToString(exclude = "password") User(id=1, scores=[80, 70, 100])
@EqualsAndHashCode(callSuper = false) callSuper = false  부모클래스와해시값다름
@Data @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode
@Builder
빌더패턴... 유연한 생성자. 
Customer.builder()
.email("test@test.com")
.auth("A")
.password("11111")
.build();

출처 :projectlombok.org/features/all

빌더패턴 : yoonbumtae.com/?p=2565

RuntimeException vs Exception: custom Exception 생성시 참고

Exception - 체크예외 : Exception 클래스 서브클래스 이면서 RuntimeException 클래스를 상속하지 않는것들
- 언체크예외 : RuntimeException을 상속한 클래스
체크예외가 발생할수 있는 메소드를 사용할때 반드시 예외 처리코드(catch, throws) 함께 작성. 
ex) FileNotFoundException 존재하지 않은 파일이름 사용자 입력시
RuntimeException 주로 프로그램의 오류가 발생했을때, 예외 처리 선택
ex) ArithmeticException  0나눌때
    IndexOutOfBoundsException 배열범위 
   

출처: m.blog.naver.com/PostView.nhn?blogId=serverwizard&logNo=220789097495&proxyReferer=https:%2F%2Fwww.google.com%2F

 

ControllerAdvice, ExceptionHandler

@ControllerAdvice
@RestControllerAdvice
특정클래스 명시가능. 
@RestControllerAdvice = @ControllerAdvice+@ResponseBody
자신이 가진 메소드중 동일예외가 있으면 실행시킴
@ExceptionHandler Exception 발생하면 비지니스 로직 중단/ client 에 어떤 문제가 있었는지 전달 위한 감시자
- @ExceptionHandler(XXXXException.class)
- @ControllerAdvice, @RestControllerAdvice내부 메소드에 사용
- Controller, RestController 만 ExceptionHandler 감시대상 , service 에서 발생해도.Controler감지
- 응답값 컨트롤러처럼 String, ModelAndView 만가능
@ResponseBody 객체로 반환, 일관성있게 만들수 있다. 
   

[Spring] ExceptionHandler velog.io/@hanblueblue/Spring-ExceptionHandler

 

@valid Email 

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package javax.validation.constraints;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.Pattern.Flag;

@Documented   //도큐먼트에 포함시키세요. 
@Constraint(  // 검증 클래스 추가. 
    validatedBy = {}//클래스명 등록
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
//~~에 쓸수 있습니다. 
@Retention(RetentionPolicy.RUNTIME)
//런타임때까지만 살아있어요.
@Repeatable(Email.List.class)
//여러개 선언할수있어요. 
public @interface Email {
    String message() default "{javax.validation.constraints.Email.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    String regexp() default ".*";

    Flag[] flags() default {};

    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface List {
        Email[] value();
    }
}

payload  요금 징수하중 

 

@Valid vs @Validated

유사하나 Validated의 경우 그룹 구현 가능

docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/annotation/Validated.html

 

POJO : Plan Old Java Object

사용자가 작성하는 클래스들이 해당 프레임 워크에 종속되지 않은것. 

m.blog.naver.com/PostView.nhn?blogId=leeyoon0607&logNo=70141610658&proxyReferer=https:%2F%2Fwww.google.com%2F

 

Java Serializable 직렬화 

직렬화 메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 형식으로 변환하는것
이유 : 
1. 데이터에 저장하거나 통신에는 값형식 데이터(원시, 스택저장)만 가능
2. 참조형식 데이터는 실제 데이터 값이 아닌 힙에 할당되어 있는 메모리 번지주소 가지고 있어
저장 통신 사용불가. 

역직렬화 디스크 저장한데이터 읽거나 네트워크 통신으로 받은 데이터 메모리에 쓸 수 있도록 다시 변환

public static final long serialVersionUID = 10001L;

hub1234.tistory.com/26#:~:text=%EC%A7%81%EB%A0%AC%ED%99%94%EB%A5%BC%20%EC%93%B0%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94,%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%EB%A7%8C%EB%93%A4%EA%B8%B0%20%EC%9C%84%ED%95%A8%EC%9D%B4%EB%8B%A4.

 

JPA Serializable

필요하지 않으나 second-level cache entry로 사용될 가능성이 있어서 안전하게 구현하기 위해 구현

discourse.hibernate.org/t/do-i-have-to-use-serializable-for-jpa-and-hibernate-entities/176

 

 

Spring Lifecycle

Filter -dofilter
-dofilter
DispatcherServlet HandlerMapping 에게 Request에 매핑할 Controller받아 옴
view Resolver에게 매핑할 view 받아옴
HandlerMapping 요청받은 controller 찾아 정보리턴
HandlerInterceptor Controller 매핑 되기 전 앞단에서 부가적인 로직 끼워넣는다. 
세션, 쿠키 권한인증로직을 주로 작성
implements HandlerInterceptor
- preHandler                *리턴값 true 주의. 
- postHandler
- afterafterCompletion
- Controller  
- Service  
- Repository DB에 접근하는 객체 DAO : Data Access Object
- Db  
ViewResolver DispatcherServlet 으로 View이름으로 요청받으면 해당 view 리턴

velog.io/@damiano1027/Spring-Spring-MVC-Request-Lifecycle

dispatcher :배치담당자

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();}

: 매핑경로를 /로 주었을때 jsp, html, css 경로 올바르게 처리 위함. 

>> component-scan 재지정 필요. >> 스프링부트 @componentScan. 이용. 실패

>>하기 추가 하니 정상사용. .

출처 : stackoverflow.com/questions/64822250/illegalstateexception-after-upgrading-web-app-to-spring-boot-2-4

@Bean
WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> enableDefaultServlet() {
return (factory) -> factory.setRegisterDefaultServlet(true);
}

 

artifact

: 인공물. :  모듈에 대한 컴파일출력, 종속성포함된 라이브러리, 리소스, 기타 artifact, 개별파일, 디렉토리 아카이브

 

www.jetbrains.com/help/idea/working-with-artifacts.html#artifact_build_options

'Web' 카테고리의 다른 글

[1028 운영] 운영 정보 모음  (0) 2021.05.02
[1028 shell script] 작성해본 기능 정리  (0) 2021.05.02
[1028 mysql,mariadb,oracle]  (0) 2021.04.30
[1028 Docker] 도커 mariadb, vi 외  (0) 2021.04.27
[1028 gradle] 에러모음  (0) 2021.04.27