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 배열범위 |
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의 경우 그룹 구현 가능
POJO : Plan Old Java Object
사용자가 작성하는 클래스들이 해당 프레임 워크에 종속되지 않은것.
Java Serializable 직렬화
직렬화 | 메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 형식으로 변환하는것 이유 : 1. 데이터에 저장하거나 통신에는 값형식 데이터(원시, 스택저장)만 가능 2. 참조형식 데이터는 실제 데이터 값이 아닌 힙에 할당되어 있는 메모리 번지주소 가지고 있어 저장 통신 사용불가. |
역직렬화 | 디스크 저장한데이터 읽거나 네트워크 통신으로 받은 데이터 메모리에 쓸 수 있도록 다시 변환 |
public static final long serialVersionUID = 10001L;
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. 이용. 실패
>>하기 추가 하니 정상사용. .
@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] (0) | 2021.04.30 |
[1028 Docker] 도커 mariadb, vi 외 (0) | 2021.04.27 |
[1028 gradle] 에러모음 (0) | 2021.04.27 |