SOLID는 객체지향 원칙으로 SRP, OCP, LSP, ISP, DIP의 앞자리를 하나씩 부르는것을 말한다. 생각보다 원칙을 지키면서 코드를 작성하는 것은 쉽지 않고, 설령 원칙을 지키면서 코드를 작성할 수 는 있지만, 원칙을 지키기다 보면 인터페이스나 클래스를 추가하게되 오히려 위 원칙을 지키지 않는 것이 훨씬 더 좋은 상황이 발생할 수 도 있다. (사람바이사람, 상황바이상황) 따라서 상황에 맞춰서 SOLID원칙을 지키면서 할지 아니면 그냥 구현으로 할지 결정을 해야한다. 그러면 이제 SOLID를 하나씩 살펴보면서 어떻게 사용될지 생각해보자. SRP : 단일 책임 원칙 이 원칙은 하나의 클래스에는 단 하나의 행동만 가져야 된다는 원칙이다. 오해하면 안되는게 절대로 하나의 기능만 있어야 된다는 뜻은 절..
LocalDateTime은 LocalDate와 LocalTime두 개를 합친 클래스입니다. 이들은 모두 java 8에 처음 등장하였습니다. 그런데 이상합니다. 자바 릴리즈 노트에 따르면 JDK Releases The release information on this page covers the Java SE releases that were widely distributed or significant to the development of Java. It does not cover patch releases or other one-off releases. java.com 2014-03-18 Major 8 LTS Documentation, JSR 337, Configurations 자바 8은 2014년 3..
나는 얼마전 스프링 시큐리티를 설치하고, 유저를 만들어서 진행을 한적이 있었다,. 그리고 오늘 프로잭트를 실행시켰다. 하지만 결과는 참담했다. 모든 테스트가 틀렸다고 나온다는 것을 알 수 있었다. 이상했다. 나는 분명... 한적이 없는데.. 알고보니 스프링 시큐리티 자체에서 유저를 만들고, 그것을 모든 테스트 코드에 적용하기 때문이라고 했다. 그래서 나온 상태코드가 403 (권한이 없다)가 나온것도 그 때문인것 같다. 그러면 어떻게 이 문제를 해결해야 될까? @Configuration @EnableWebSecurity public class SpringConfig extends WebSecurityConfigurerAdapter{ } 이걸 추가하게 되면 스프링 시큐리티에서 적용되는 시큐리티는 더 이상 적..
원래는 스프링 시큐리티에 대해 공부하고 하려다가 너무 오래 걸릴 것 같아 생략하고 적용하는것부터 진행하려고 한다. 아무튼 스프링 시큐리티를 적용하는 이유는 게시글을 만든 유저만 수정이 가능하게 만들기 위해 적용하는걸로 알고 있다. 아무튼... 적용해보자. org.springframework.security.oauth.boot spring-security-oauth2-autoconfigure 2.1.10.RELEASE 이것을 추가해줘야 스프링 시큐리티를 사용할 수 있게 된다. (이글은 백기선님 강의를 보고 작성한 글이기때문에 start.security를 사용하지 되지 않습니다.) 생각해보니 vo를 만들지 않았다. @Getter @Setter @Builder @NoArgsConstructor @AllArgs..
이번에는 강의를 듣기전에 먼저 작성하기로 해보자. 이벤트 수정의 경우는 1. 수정이 정상적으로 실행이 되었을때 : 200 2. 수정이 잘못된 경우 - 비어있는 객체가 들어있을 경우. - 잘못된 객체가 들어올 경우.. - 권한이 없는 사람이 접근했을 경우 - 페이지가 존재하지 않는 경우 이렇게 들 수 있는데... 솔직히 2-3은 지금당장은 하지 못할 것 같다. 왜냐하면 유저를 고려하지 않았기 때문이다. 테스트 코드를 작성해보자. @Test void update_event() throws Exception { Delivery delivery = generateEvent(100); DeliveryDto deliveryDto = modelMapper.map(delivery, DeliveryDto.class); ..
곧 회사일이 바빠진다고 한다. 바빠지기 전에 열심히 공부 하자! 간단하게 테스트 부터 작성해보자. @Test public void create_event() throws Exception { Delivery delivery = generateEvent(100); this.mockMvc.perform(get("/api/delivery/{id}",delivery.getId())) .andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("id").exists()) .andExpect(jsonPath("_links.self").exists()) .andExpect(jsonPath("_links.profile").exists()); } 이것을 실행하면 어..
먼저 테스트 코드부터 작성하자. @Test void eventQuery() { IntStream.range(0, 30) .forEach(this::generateEvent); } private void generateEvent(int index) { Delivery delivery = Delivery.builder() .item("Delivery" + index) .user("klom") .build(); deliveryRepository.save(delivery); } 이렇게 작성하면 나는 0번부터 30번까지의 이벤트를 생성하는 로직이다. 그러면 생각해야 될것이 이제 이것들을 테스트를 해야 된다. 최종 코드는 다음과 같다. @Test void eventQuery() throws Exception { I..
* 여기서 인덱스란? 메인 페이지를 뜻합니다. 메인페이지를 위한 테스트 코드를 작성하자. @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc @AutoConfigureRestDocs @Import(RestDocsConfiguration.class) @ActiveProfiles("test") public class IndexControllerTest { @Autowired private MockMvc mockMvc; @Test void index() throws Exception { mockMvc.perform(get("/delivery")) .andDo(print()) .andExpect(sta..
람다는 왜 만들어졌을까? 람다를 사용하게 되면 굉장히 코드가 단순해진다는 것을 느낄 수 있다. 런타임시에는 익명 함수로 사용하든 람다식으로 고쳐서 사용하든 상관없다는 뜻이 된다. 최대한 간결하게 만들어서 실수를 방지 하는것이 좋지 않을까? 예를 들어, Hello hello = new Hello() { @Override public void write(String writer) { System.out.println(writer); } }; 다음과 같은 익명 함수가 존재한다고 해보자. 이것을 람다로 사용하게 된다면, Hello hello = writer -> { System.out.println(writer); }; 단, 한줄로 코드가 변경되었다. 여기서 의문인것이 어노테이션, enum,제네릭과 달리 이전 ..
이제 문서를 빌드해보자. 그전에 pom.xml에 다음을 작성하자. org.asciidoctor asciidoctor-maven-plugin 1.5.8 generate-docs prepare-package process-asciidoc html book org.springframework.restdocs spring-restdocs-asciidoctor ${spring-restdocs.version} maven-resources-plugin 2.7 copy-resources prepare-package copy-resources ${project.build.outputDirectory}/static/docs ${project.build.directory}/generated-docs 만약에 버전이 맞지 않는..
오랜만에 작성하는것 같다. 아무튼 다시 작성하게 되어서 기쁘다.! restAPI docs를 만들기 위해서는 org.springframework.restdocs spring-restdocs-mockmvc test 이 의존성을 추가해줘야 한다. RestApi 만들기 - spring-rest-docs (5) 자 드디어 rest-docs를 적용할때가 왔다. Spring REST Docs Document RESTful services by combining hand-written documentation with auto-generated snippets produced with Spring MVC Test. docs.spring.io.. b-programmer.tistory.com 이글에서 spring-rest..
모듈(module)은 역사적으로 프로그래밍이라는 관점에서는 기본적으로 본체에 대한 독립된 하위 단위라는 필연적인 개념의 큰 틀을 따르고 있지만 본체와 모듈 간에 가지고 있었던 문제들을 해결해 나가는 과정에서 발전하였다. 모듈에 가장 큰 영향을 미쳤던 클래스 그리고 라이브러리가 향상됨에 따라 점차 발전하였다. 이러한 지속 가능성은 이것의 가장 큰 장점 중 하나이다. 초기에는 분리된 독립성의 모듈로 도입되었으나 점차로 객체화, 캡슐화, 모듈화 프로그래밍 기법 등 여러 기능들이 추가되면서 점차적으로 영역이 나뉘어가고 있다. 그러나 이로 인하여 모듈성을 제대로 반영하지 못하고 있다는 비난을 받을 수도 있다. 한편 이러한 비난은 모듈 시스템, 모듈 프로그래밍이 갖는 현재의 한계를 인식하고 보다 안정적으로 발전하기..