-
CH 2. Mockito
1. Mockito 소개 Mock: 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접 그 객체의 행동을 관리하는 객체 단위 테스트? 마틴 파울러의 유닛 테스트의 정의 https://martinfowler.com/bliki/UnitTest.html 모든 의존성을 끊고 테스트해야만 유닛 테스트인가? 단위의 개념을 행동의 단위라고 생각하는것이 적절하다. 는 의견도 있다. Bango payment : Payment Mocking 서비스 (테스트 환경) 2. Mockito 시작하기 spring-boot-starter 의존성 내... Read More
-
CH 1. JUnit5
1. JUnit5 소개 JUnit5 구성 : JUnit Platform 위에 Jupitor, Vintage가 올라가는 형태 Platform : 테스트를 실행해주는 런처 제공. TestEngine API 제공 Jupitor : TestEngine API 구현체 Vintage : JUnit 4,3을 지원하는 TestEngine API 구현체 SpringBoot 2.2 이상부터 JUnit5가 기본으로 설정되어 있다. (JUnit-Jupitor-Engine) 2. JUnit5 시작하기 Test Class나 Method를 public으로 ... Read More
-
CH 2. 이벤트 생성 API 개발
이벤트 생성 API 개발 1. 이벤트 API 테스트 클래스 생성, 201 응답받기 먼저 EventController의 Test클래스를 만들어준다. @ExtendWith(SpringExtension.class) @WebMvcTest public class EventControllerTest { @Autowired MockMvc mockMvc; @Autowired ObjectMapper objectMapper; @Test public void createEvent() throws Exception { Event event = Event.bui... Read More
-
CH 1. REST API 및 프로젝트 소개
REST API 및 프로젝트 소개 REST 란? 이라는 질문을 굉장히 어디서 많이 듣기도 하고 보기도 한다. 사실 해당 질문을 받았을 때, 굉장히 어물쩡하게 넘어간 적이 많다. 그냥 위키에 나와있는대로 아키텍쳐 스타일이라는 정도로만 이해하고 있었기 때문에 해당 질문에 대한 개념적인거나 REST의 존재 의의나 목적에 대한 이해는 하지 못했기 때문이다. 백기선님이 강의내에서 언급하고 정리해서 알려주시긴 하지만, 직접 해당 스피치의 링크르 따라 들어가 내용을 정리해 보았다. DEVIEW 스피치 정리글 1. Project 생성 프로젝트 생... Read More
-
퇴사 후 이직까지의 회고 그리고 마음가짐
제주도에서 개발자의 삶을 살다가 며칠전 경기도에 있는 모 회사로 이직을 했다. 이전 4개월 동안의 행보를 읊자면 이렇다. 11월경에 퇴사를 하고 12월에 외주작업을 하나 했다. 한달반만에 프로젝트 하나를 끝내려니 매우 힘에 부쳤지만 어찌어찌 완료는 했다. 제주도는 개발자에게 있어서 매우 계륵과 같다는 생각을 많이했다. 제주도라는 뭔가 평화로운 환경? 속에서 성장을 위한 답답함이 상충하는 느낌이다. 또, 나름 큰 회사라고 해도 확실히 서울 및 경기에 있는 큰 IT회사들과 비교하면 개발자 문화라던지 담당업무 외 일들을 쉽게 할 수 있도록 도와주는 여러 부서들의 존재같은 것들이 크다고 느껴졌다. 그래서 결국에는 이... Read More
-
그런 REST API로 괜찮은가?
이응준님의 DEVIEW 스피치 - 그런 REST API로 괜찮은가? 1. REST의 등장 일단 REST라는 개념이 어떻게 등장했는지에 대해서 먼저 설명해 주신다. WEB의 원시적 단계를 거친 후 HTTP와 XML을 결합한 SOAP가 있었다. 그리고 앞으로 많이 언급하게될 Roy T. Fielding은 1994-1996년 HTTP/1.0 설계에 참가했고, 어떻게 WEB을 깨뜨리지 않으면서 HTTP를 발전시킬 수 있을까? 라는 고민에서 HTTP Object Model 이라는 것을 만들었다고 한다. 그리고 1998년, Microsoft Research에서 REST(... Read More
-
SpringBoot 2.6.x 버전에서 Springfox 3.0.0(Swagger, AOP) 강제적용하기
일시 2021/12/17 인 현재 시점에서 스프링부트 2.6.x 버전에는 스프링폭스 3.0.0을 적용이 안된다. 의존성에 둘을 추가하면, 다음과 같은 에러를 뱉는다. org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.g... Read More
-
자주쓰는 리눅스 명령어 모음
기초 명령어 cp <copy-file-path> <paste-file-path> SSH 접속 ssh <user>@<ip> -p <port> ssh -i <pem-file-location> <user>@<ip> -p <port> SSH로 파일 복사 scp -i <pem-file-location> <copy-file-path> <user>@<ip>:<paste-path> 기타 free : 메모리 체크 df : 용량 체크 Read More
-
CH3. 네트워크 통신하기 (2)
대망의 TCP와 UDP이다.. 이 책을 공부하기로 마음먹었던 가장 큰 내 걸림돌이기도 하다. 얼른 정리를 해보자. 4. TCP, UDP 앞서 설명한 2,3계층은 목적지를 정확히 찾아가기 위한 주소제공이 목적이지만 4계층에서 동작하는 프로토콜은 목적지 단말내에서 동작하는 어플리케이션 프로세스를 찾아가도록 하며 패킷 순서가 바뀌지 않도록 잘 조합하여 원래 데이터를 만들어 내는 역할을 한다. 4.1 4계층 프로토콜과 서비스 포트 TCP/IP 프로토콜 스택에서 4계층은 TCP와 UDP가 담당한다. 그리고 이 프로토콜에서 헤더에 들어있는 상위 프로토콜 지시자는 포트번호이다. 2,3계층에서의 상위 프로토콜 지시자는 출... Read More
-
CH3. 네트워크 통신하기 (1)
1. 캐스트 출발지에서 목적지로 데이터를 전송할 때 사용하는 통신 방식은 다음과 같다. 유니캐스트 (1:1) 출발지와 목적지가 각각 1개로 명확히 정해져 있는 1:1 통식방식이다. 대부분의 통신은 유니캐스트 통신이다. 브로드캐스트 (1:All) 목적지 주소가 모든으로 표기되어 있는 통신 방식이다. 동일 네트워크에 존재하는 모든 호스트가 목적지이다. 멀티캐스트 (1:Group) 멀티 캐스트는 그룹 주소를 이용해 해당 그룹에 속한 다수의 호스트에게 전달하기 위한 통신 방식이다. IPTV와 같은 실시간 방송을 볼 때 이 멀티캐스트 통신 방식을 사용한다. 사내 방송이나... Read More
-
CH2. 네트워크 연결과 구성요소 (2)
3. 네트워크 구성 요소 3.1 네트워크 인터페이스 카드 흔히 랜 카드라고도 불리는 장비이다. 컴퓨터에 네트워크를 연결하기 위한 하드웨어 장비이다. 주요 역할은 다음과 같다. 직렬화 전기 신호를 데이터 신호로 혹은 데이터 신호를 전기 신호로 변환한다. MAC 주소 고유 MAC 주소를 갖는다. 입력받은 패킷의 도착지 주소가 자신의 MAC 주소가 아니라면 폐기한다. 흐름 제어 이미 통신중인 데이터를 처리하고 있어 새로운 데이터를 받지 못하는 상황에 상대방에게 통신 중지를 요청할 수 있다. 3.2 케이블과 커넥터 3.3 허브 허브는 케이블과 동일한 1계층에서 동작한다. 거리가 멀어질수록 줄어드는... Read More
-
CH2. 네트워크 연결과 구성요소 (1)
대중화된 인터넷기술이 보통 이더넷-TCP/IP 기반이어서, 기술이 점점 단순화되고 있지만 아직 용도와 필요에 따라 다양한 네트워크 기술 요소들이 사용된다. 이번 장에서는 네트워크 연결방법을 구분하고 연결에 필요한 회선과 구성요소를 알아보자. 1. 네트워크 연결 구분 네트워크는 규모와 관리범위에 따라 3가지로 구분된다. LAN (Local Area Network) : 사용자 내부 네트워크 MAN (Metro Area Network) : 한 도시를 연결하고 관리하는 네트워크 WAN (Wide Area Network) : 멀리 떨어진 LAN을 연결하는 네트워크 예전에는 LAN, MAN, WAN 이 ... Read More
-
CH1. 네트워크 시작하기 (2)
5. 인캡슐레이션과 디캡슐레이션 상위 계층에서 하위계층으로 데이터를 보내면, 물리계층에서 전기 신호 형태로 네트워크를 통해 신호를 보낸다. 받는 쪽에서는 다시 하위 계층에서 상위 계층으로 데이터를 보낸다. 데이터를 보내는 과정을 인캡슐레이션, 받는 과정을 디캡슐레이션이라고 부른다. 인캡슐레이션 상위계층에서 하위계층으로 데이터를 내려보내면서 패킷에 데이터를 넣을수 있도록 분할하고, 프로토콜에 대한 정보를 헤더에 넣는 과정 헤더 정보는 4계층부터 붙기 시작한다. 각 계층마다 한개의 헤더씩 붙어 4,3,2 계층의 헤더가 붙게 된다. 디캡슐레이션 ... Read More
-
CH1. 네트워크 시작하기 (1)
이번 모 회사의 면접을 진행할 때, 네트워크 계층에서 기본적인 것들의 관한 질문이 꽤 있었다. 하지만, 평소 내가 개발을 하면서 접하고 있음에도 불구하고 질문에 대해 제대로 된 답변을 하지 못하였다. 이에, 미뤄왔던 네트워크 공부를 해야겠다고 생각이 들었고 기본 입문서로 많이 추천하는 IT 엔지니어를 위한 네트워크 입문이라는 책을 구매하여 정리를 시작해보려 한다. 1장에서는 모든 네트워크의 이론적 기반이 되는 OSI 7계층, 그리고 패킷이 실제로 전송되는 인캡슐레이션에 대해 알아본다. 1. 네트워크 구성도 살펴보기 1-1. 홈 네트워크 보통 홈 네트워크는 인터넷 - 모뎀 - 공유기 - 단말의 순서로 구성되어... Read More
-
CH3. 웹 어플리케이션 시큐리티(1) WebAsyncManagerIntegrationFilter
스프링 시큐리티 ignoring() WebSecurity의 ignoring()을 사용해서 시큐리티 필터 적용을 제외할 요청을 설정할 수 있다. @Override public void configure(WebSecurity web) throws Exception { web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations()); } 스프링 부트가 제공하는 PathRequest를 사용해서 정적 자원 요청을 스프링 시큐리티 필터를 적용하지 않도록 설정. 다른 방법에 대한 조언 http.authorizeRequests... Read More
-
CH2. 아키텍쳐(6) FilterSecurityInterceptor, Summary
이번 시간에는 AccessDecisionManager를 누가 호출해주는지 알아보도록 하자. FilterSecurityInterceptor AccessDecisionManager를 사용하여 Access Control 또는 예외 처리 하는 필터. 대부분의 경우 FilterChainProxy에 제일 마지막 필터로 들어있다. FilterSecurityInterceptor 의 부모인 AbstractSecurityInterceptor를 들어가보면, attempAuthorize라는 메소드가 있는데 이부분이 AccessDecisionManager를 호출하는 곳이다. private void attemptAuthoriza... Read More
-
CH2. 아키텍쳐(5) AccessDecisionManager
지금까지는 인증에 대한 스프링시큐리티의 동작원리를 살펴보았다면, 앞으로는 인가 즉 권한관리(Access Control)을 스프링시큐리티가 어떻게 하고있을까? 에 대해 알아보자. AccessDecisionManager Access Control 결정을 내리는 인터페이스로, 구현체 3가지를 기본으로 제공한다. AffirmativeBased: 여러 Voter중에 한명이라도 허용하면 허용. 기본 전략. ConsensusBased: 다수결 UnanimousBased: 만장일치 AccessDecisionVoter 해당 Authentication이 특정한 Object에 ... Read More
-
CH2. 아키텍쳐(4) Filter&FilterChainProxy, DelegatingFilterProxy
Filter와 FilterChainProxy 스프링 시큐리티가 제공하는 필터들 WebAsyncManagerIntergrationFilter SecurityContextPersistenceFilter HeaderWriterFilter CsrfFilter LogoutFilter UsernamePasswordAuthenticationFilter DefaultLoginPageGeneratingFilter DefaultLogoutPageGeneratingFilter BasicAuthenticationFilter RequestCacheAwareFtiler SecurityContext... Read More
-
CH2. 아키텍쳐(3) SecurityContextPersistenceFilter
Authentication와 SecurityContextHolder AuthenticationManager가 인증을 마친 뒤 리턴 받은 Authentication 객체의 행방은? Authentication은 SecurityContextHolder에 담겨져 Application전반에 사용할 수 있게 된다. 그러면 이 Authentication객체를 SecurityContextHolder에 담아주는 녀석은 누구일까? UsernamePasswordAuthenticationFilter 폼 인증을 처리하는 시큐리티 필터 인증된 Authentication 객체를 SecurityConte... Read More
-
CH2. 아키텍쳐(2) AuthenticationManager
AuthenticationManager와 Authentication 지난시간에는 Authentication가 무엇이고, 어떤 정보들을 담고 있는지에 대해 배웠고, 이번 시간에는 이 Authentication을 실제로 만들고 인증을 처리하는 AuthenticationManager에 대해 배워보자. Authentication authenticate(Authentication authentication) throws AuthenticationException; AuthenticationManager 안에는 authenticate라는 메소드 하나만 존재한다. 인자로 받은 Authentication이 유효한 인증인... Read More
-
CH2. 아키텍쳐(1) SecurityContextHolder
SecurityContextHolder와 Authentication 이번시간부터는 Spring Security Architecure에 관한 내용이다. 일단 이번에 살펴볼 항목들은 SecurityContextHolder 와 Authentication 부분이다. SecurityContextHolder와 Authentication SecurityContextHolder SecurityContext를 제공하며, 기본적으로 ThreadLocal을 사용한다. ThreadLocal : 한 쓰레드 안에서 공유하는 저장소라고 생각하면 편함. SecurityContex... Read More
-
CH1. 폼 인증(4)
스프링 시큐리티 테스트 2부 이번시간에는 폼 로그인 기능이 제대로 작동하는지 테스트해보는 시간을 가질 것이다. 현재는 스프링시큐리티가 제공해주는 기본 formLogin을 사용하고 있지만, 추후에 직접 제작한 폼 로그인을 사용 하려면 이 테스트가 필요하게 될 것이기 때문이다. @Test public void login() throws Exception { mockMvc.perform(formLogin().user("dboo").password("123")) .andExpect(authenticated()); } 그런데, 지금 user정보가 없기때문에 해당 테스트는 실패한 것으로 ... Read More
-
CH1. 폼 인증(3)
지금까지 시큐리티 설정을 계속 웹브라우저에서 테스트하였는데, 테스트 코드를 통해 테스트 하는 방법을 알아보고 활용해보자. 스프링 시큐리티 테스트 1부 일단 spring-security-test 라는 의존성을 추가해준다. <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> <version>${spring-security.ver... Read More
-
CH1. 폼 인증(2)
스프링 시큐리티에 JPA 연동하기 이전 시간에는 직접 만든 유저정보로 로그인을 했지만 실서비스에서는 DB에 암호화된 유저정보를 가지고 있다가, 해당 유저정보에 맞는 로그인 요청에 대해서 인가를 해줘야 한다. 따라서 DB에 있는 유저정보를 통해 로그인이 가능하도록(DAO를 통해) 해보자. 일단 JPA를 연동하기 위해 JPA의존성과 인메모리 DB로 사용할 H2데이터베이스의 의존성을 추가하자. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-dat... Read More
-
CH1. 폼 인증(1)
스프링 웹 프로젝트 만들기 일단 스프링 이니셜라이져를 통해서 스프링 부트 어플리케이션을 하나 만들어준다. 의존성은 web, thymeleaf 두개만 추가해주면 된다. resource아래에 template폴더에(없으면 생성) index, info, admin, dashboard 페이지를 만들어준다. <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Hello</title> </head>... Read More
-
Part3 - CH7. REST Template(3) Header, exchange
REST Template (3) Header REST Template의 exchange메소드를 활용해보자. 이전 시간에는 Request를 보낼 때 dto와 objectMapper의 기능을 이용해 JSON만 보냈지만 이번 시간에는 RequestEntity를 사용하여 Header을 추가하는 방법에 대해 알아본다. restTemplateService 클래스안에 exchange()메소드를 만든다. public UserResponse exchange(){ //http://localhost:9091/api/server/user/{userId}/name/{userName} URI uri = UriComp... Read More
-
Part3 - CH7. REST Template(2) POST
REST Template (2) 이번 시간에서는 REST Template을 활용하여 POST요청을 보내고 받는것을 실습한다. 일단 클라이언트에서 postFor~~ 를 활용해서 요청해보자. 일단 Post를 보내기 위한 dto를 생성하자. @Data public class UserRequest { private String name; private int age; } dto와 UriBuilder를 활용하여 post를 보내는 서비스를 생성한 후, public UserResponse post(){ //http://localhost:9091/api/server/user/{userId}/n... Read More
-
Part3 - CH7. REST Template(1) GET
Server-To-Server 통신하기 지금까지 살펴본 부분은 Server로서 Client에 API를 제공하는 방법을 학습했다. Back-end에서 다른 Server에 요청을 보내서 받는 것을 필수적이다. RestTemplate, WebClient, Apache Client… 등이 있다. 이 중에 스프링에서 전통적으로 사용하는 RestTemplate에 대해 알아보자. RestTemplate(1) Client 생성 API요청을 받을 Client서버를 먼저 만들자. Port는 8081로 설정했다. 먼저 서버에 요청을 보내는 로직을 구현할 RestTemplateService를 만들자. @Se... Read More
-
Part3 - CH6. 스프링 기능 활용하기(6) Async
Async EnableAsync, Async 어노테이션으로 적용 비동기로 돌아가야하는 서비스가 있다면 그 앞에 @Async 어노테이션을 붙인 후에, 스프링부트 어플리케이션 클래스에 @EnableAsync 어노테이션을 붙여주면 비동기로 동작한다. @EnableAsync @SpringBootApplication public class AsyncApplication { public static void main(String[] args) { SpringApplication.run(AsyncApplication.class, args); } } @RestController @Requ... Read More
-
Part3 - CH6. 스프링 기능 활용하기(5) Interceptor
Interceptor Interceptor란 Filter와 매우 유사한 형태이지만, Spring Context에 등록된다는 차이점이 있다. AOP와 유사한 기능을 제공할 수 있으며, 주로 인증단계를 처리하거나 Logging하는데에 사용한다. Life-Cycle 도식도를 보면 알겠지만, Filter와는 다르게 DispatcherServlet을 거친 후에 Controller 와 같은 영역에 있다. Interceptor 활용하기 권한이 있는 곳에서의 요청만 받는 컨트롤러와, 어떤 요청이라도 받는 컨트롤러를 만든다고 가정하고 실습을 진행 해보자. @RestController @RequestMapping("/... Read More
-
Part3 - CH6. 스프링 기능 활용하기(4) Filter
Filter Filter : Web Application에서 관리되는 영역, Spring Boot Framework에서 Client로 오는 요청/ 응답에 대하여 최초/최종단계의 위치에 존재하며, 이를 통해서 요청/응답의 정보를 변경하거나 Spring에 의해 데이터가 변환되기 전의 순수한 Client의 요청/응답 값을 확인 할 수 있다. 유일하게 ServletRequest, ServletResponse의 객체를 변환 할 수 있다. 주로 request/response의 Loggin용도로 활용하거나, 인증과 관련된 Logic들을 해당 Filter에서 처리한다. Filter의 전역적 사용 Filter ... Read More
-
Part3 - CH6. 스프링 기능 활용하기(3) Validation 모범사례
Validation 모범사례 지난 Validation 수업에서는 DTO 에 어노테이션을 붙여서 값 검증을 했었는데, 컨트롤러에서 간단하게 붙이고 싶다면 다음과 같이 할 수 있다. @RestController @RequestMapping("/api") @Validated // 컨트롤러에서 바로 Validation 어노테이션을 쓰기 위해 붙여준다. public class ApiController { @GetMapping("") public User get( @Size(min = 1) //이런식으로 바로 validation 어노테이션 적용 가능하다. @Req... Read More
-
Part3 - CH6. 스프링 기능 활용하기(2) Exception
Web Application에서 에러를 알리는 방법은 다음과 같다. 에러 페이지 4XX or 5XX error 클라이언트가 200외에 처리를 하지 못하는 경우, 200과 함께 error메세지 전달 전체 어플리케이션에 대해서 한번에 Exception을 처리하는 스프링의 방식은 다음과 같다. @ControllerAdvice : Global 예외 처리 및 특정 package/Controller 예외처리 @ExceptionHandler : 특정 Controller의 예외 처리 실습환경 구성 일단, RestController와 값을 받을 DTO를 생성해준다. public class User { ... Read More
-
Part3 - CH6. 스프링 기능 활용하기(1) Validation
Spring Boot Validation Validation Validation이란? 값에 대한 검증을 하는 것을 말하며, 보통 java프로그래밍에서는 NPE(Null Point Exception)을 위한 Null값 검증을 하는것을 말한다. public void run(String account, Spring pw, int age){ if(account == null || pw == null){ return; } if(age == 0){ return; } } 검증해야 할 값이 많은 경우 코드의 길이가 길어진다. 구현에 따라서 달라질 수 있지만 Service Lo... Read More
-
Part3 - CH5. 스프링 더 알아보기(3) ObjectMapper 더 알아보기
ObjectMapper 더 알아보기 gradle + java 프로젝트로 생성한 후, Jackson Databind 라이브러리를 gradle의존성에 추가한다. 지난 강의에서 한 부분까지 리마인드를 해보자. ObjectMapper Basic public class User { private String name; private Integer age; private List<Car> cars; } //getter, setter, toString 생략 public class Car { private String name; private String carNumbe... Read More
-
Part3 - CH5. 스프링 더 알아보기(2) AOP
AOP 관점 지향 프로그래밍 특별한 경우를 제외한 스프링 MVC 웹 어플리케이션에서는 Web Layer, Buisness Layer, Data Layer로 정의. Web Layer : REST API를 제공하며, Client중심 로직 적용 Business Layer : 내부 정책에 따른 로직개발 Data Layer : 데이터베이스 및 외부와 연동을 처리 주요 어노테이션 Annotation 의미 @Aspect 자바에서 널리 사용하는 AOP프레임워크에 포함되며,AOP를 정의하는 Class에 할당... Read More
-
Part3 - CH5. 스프링 더 알아보기(1) IoC/DI
Spring Framwork “테스트의 용이성”, “느슨한 결합”에 중점을 두고 개발 가운데 POJO를 중심에 두고, 3가지 특징을 중심으로 개발하도록 설계된 프레임워크이다. IoC / DI IoC (Inversion of Control) 제어의 역전이라는 뜻이다. 스프링에서는 일반적인 Java 객체를 new로 생성하여 개발자가 관리하는 것이 아 니라, Spring Container에게 맡긴다. 객체 제어의 권한을 프레임워크가 갖고 있음을 뜻한다. 프레임워크의 Spring Container안에서 싱글톤 객체로 관리된다. DI (Dependency ... Read More
-
Part3 - CH4. 스프링 부트 시작하기(3) 응답, ObjectMapper
Response 내려주기 응답코드 //ResponseEntity @PutMapping("/put") public ResponseEntity<User> put(@RequestBody User user){ return ResponseEntity.status(HttpStatus.CREATED).body(user); } 스프링에 있는 ResponseEntity객체와 HttpStatus Enum을 이용하여 응답을 내릴 수 있다. Controller 지금까지 배운 RESTController의 경우, 응답내용을 실어서 보내는 컨트롤러라면 Controller 의 경우, 응 답하는 html페이지를 리턴... Read More
-
Part3 - CH4. 스프링 부트 시작하기(2) PUT/DELETE API
PUT API 리소스가 없으면 생성, 있으면 갱신한다. 쿼리파라미터를 쓰지 않고 데이터바디를 이용하는 것이 권장된다. PUT CODE 예제 Controller에서 사용할 Dto작성먼저 해보자. public class PutRequestDto { private String name; private int age; private List<CarDto> carList; //toString, getter, setter 생략 } PutRequestDto에서 CarDto의 List를 받도록 되어있고, CarDto도 정의해줘야한다. public class Car... Read More
-
Part3 - CH4. 스프링 부트 시작하기(1) Spring Boot, GET/POST API
SpringBoot Spring Boot는 프로덕션 수준의 스프링 기반 어플리케이션을 쉽고 빠르게 만들 수 있다. Spring Boot는 Spring구성이 거의 필요하지 않다. Spring Boot는 java -jar로 실행하는 Java 어플리케이션을 만들 수 있다. 주요 목표 Spring 개발에 대해 빠르고 광범위하게 적용할 수 있는 환경 기본값 설정이 있지만 바꿀 수 있다. 대규모 프로젝트에 공통적인 비 기능 제공(보안, 모니터링 등) XML 구성 요구사항이 전혀 없다. Build Tool : Maven, Gradle Servlet Container : To... Read More
-
MacOS에 virtualBox + vagrant로 OracleDB 설정하기
일단 virtualBox와 vagrant를 설치해야한다. 사실 도커로 할 수도 있지만, docker 볼륨설정에 대한 공부가 덜 되어있어서 이 방법으로 진행하기로 했다. brew install --cask vagrant brew install --cask virtualBox 그 후에, Oracle에서 제공하는 깃허브 저장소에서 프로젝트를 내려받는다. 프로젝트를 열어보면 많은 것들이 있는데 OracleDatabse폴더로 진입한다. . ├── CODEOWNERS ├── CONTRIBUTING.md ├── ContainerRegistry ├── ContainerTools ├── DockerEngine ├── LA... Read More
-
<인프런> Vue.js 시작하기 CH4. 컴포넌트
ref : 장기효님 블로그, Inflearn Vue.js시작하기 강의 Vue Component 컴포넌트는 화면의 영역을 구분하여 개발할 수 있는 뷰의 기능이다. 컴포넌트 기반으로 화면을 개발하게 되면 코 드의 재사용성이 올라가고 빠르게 화면을 제작할 수 있다. Vue 전역 컴포넌트 <div id="app"> <!-- 컴포넌트 태그를 만들어 주면 컴포넌트에 등록한 내용이 바로 반영이 된다. --> <app-header></app-header> <app-content></app-content> </div> &l... Read More
-
<인프런> Vue.js 시작하기 CH3. Vue 인스턴스 소개
ref : 장기효님 블로그, Inflearn Vue.js시작하기 강의 Vue Instance Vue Instance 는 뷰로 개발할 때 필수로 생성해야하는 코드이다. Create Vue Instance 인스턴스는 아래와 같이 생성하고, 해당 인스턴스를 콘솔에 출력하면 어떤 속성과 API가 있는지 확인 할 수 있다. var vm = new Vue(); console.log(vm); 라이브 서버 콘솔에서 다음과 같이 확인 가능하다. 뷰에서 제공하는 API와 속성들이 나오는 것을 볼 수 있다. 그럼 이 뷰 인스턴스를 어떻게 사용하느냐 하면, vue인스턴스 생성자 함수에서 vue인스턴스 기능을 사용하고... Read More
-
<인프런> Vue.js 시작하기 CH2. Vue.js 소개
ref : 장기효님 블로그, Inflearn Vue.js시작하기 강의 Vue.js 살펴보기 Vue는 무엇인가? MVVM패턴의 뷰모델(ViewModel)레이어에 해당하는 화면단 라이브러리 DOM Listener 가 DOM단에서 일어나는 이벤트를 받아서 javascript단에 전달하고, 거꾸로 javascript 단에서 일어나는 데이터 변화 등을 Data Bindings를 통해 화면으로 반영하게 된다. 하기 항목은 강의자이신 장기효님 블로그에서 발췌한 설명문 입니다. 데이터 바인딩과 화면 단위를 컴포넌트 형태로 제공하며, 관련 API 를 지원하는데에 궁극적인 목적이 있음 Angular에서 지원하... Read More
-
<인프런> Vue.js 시작하기 CH1. 개발환경 설정
ref : 장기효님 블로그, Inflearn Vue.js시작하기 강의 개발환경 설정 Visual Studio Code IDE Chrome vue-js devtools npm (nodejs LTS) VSCode 플러그인 설치 및 설정 Vetur : vue tool for vscode Meterial Icon Theme : google material icon (Optional) night owl : code highlight tool (Optional) live server : local server tool 구현된 코드를 브라우저에 열어서 보는게 아니라 로컬서버로 띄 워서 보는것이 더 좋다.... Read More
-
Part3 - CH3. 웹 개발 개론
웹 개발이란? Web의 기본 3요소 URI : Uniform Resource Indentifier 리소스 식별자이다. 웹상에서 특정 정보에 접근하기 위한 정보를 말한다. HTTP : Hypertext Transfer Protocol 처음에는 HTML만을 전송하기위한 프로토콜이었으나, 현재는 다양한 정보를 전송한다. GET, POST, PUT, … 등 여러가지 프로토콜이 존재한다. HTML : Hyper Text Markup Language XML을 바탕으로 한 범용 문서 포맷 REST란? REST REST는 Representational State... Read More
-
Part3 - CH2. 디자인패턴(2) 퍼사드, 전략 패턴
Facade Pattern Facade는 건물의 앞쪽 정명 이라는 뜻을 가진다. 여러 객체와 실제 사용하는 서브 객체의 사이에 복잡한 의존 관계가 있을 때, 중간에 facade라는 객체를 두고 여기서 제공하는 interface만을 활용하여 기능을 사용하는 방식이다. Facade는 자신이 가지고 있는 각 클래스의 기능을 명확히 알아야 한다. FTP클라이언트를 만든다고 가정하고 코드를 구현해 보자. 일단 Facade패턴을 적용하지 않은 코드를 먼저 구현해 보자. public class Ftp { private String host; private int port; private String path; ... Read More
-
Part3 - CH2. 디자인패턴(2) 프록시, AOP 패턴
Proxy Pattern Proxy는 대리인 이라는 뜻으로, 뭔가를 대신해서 처리하는 것 Proxy Class를 통해서 대신 전달하는 형태로 설계되며, 실제Client는 Proxy로부터 결과를 받는다. Cache의 기능으로도 활용이 가능하다. SOLID 원칙 중에서 개방폐쇄원칙과(OCP)과 의존 역전 원칙(DIP)을 따른다. public interface IBrowser { Html show(); } public class Html { private String url; public Html(String url){ this.url = url; } } public class Br... Read More
-
Moonlander 키보드 세팅
아기다리 고기다리 던 내 생애 첫 어고노믹 키보드 문랜더 MARK 1 이 도착했다. 아직까지도 적응하는데에 엄청 고생을 하고 있다. 업무를 봐야하는데 키보드가 적응이 안되서 약간 일의 능률이 떨어진 상태이다…하하 키보드는 여러개의 레이아웃을 줄 수 있고, 키 세팅은 키보드에 저장되어 어디에 꽂아 사용하던지 똑같은 레이아 웃으로 사용할 수 있다. 제일 골치가 아픈 점이, 방향키를 설정할 만한 공간이 부족하다는 것이다. 나는 일단 엄지손가락을 사용하라고 만들어놓은 공간에 제작자의 의도와 다르게 방향키를 설정해서 사용중이다. 2021-05-03 문랜더 키보드 세팅이다. 디폴트 레이아웃 기능 키 및... Read More
-
jQuery 중복되는 아이디 태그에 동시에 변경하기
jQuery를 사용하다보면, 중복된 아이디 값을 가진 태그에 변경을 가하려고 할 때가 있다.(원래 아이디값은 고유한게 이상적이지만) 기존에 하던대로 #셀렉터를 이용하면 다음과 같은데, $("#myId").text("myId를 가진 태그에 변경할 텍스트!"); 이러면 myId를 아이디로 갖는 태그중 한개만 적용된다. myId를 아이디로 갖는 모든 태그의 텍스트값을 변경하고 싶다면, 다음과 같이 하면 적용된다. $("[id=myID]").text("myId를 가진 모든 태그의 텍스트가 변경됩니다.!"); Read More
-
Part3 - CH2. 디자인패턴(1) 싱글톤, 어댑터 패턴
Design Pattern 디자인 패턴이란? 자주 사용하는 설계 패턴을 정형화한 것 GOF(Gang Of Four) 디자인 패턴 소프트웨어 설계 경험을 바탕으로 정리한 디자인 패턴을 정리한 것. 총 23개의 디자인 패턴이 있다. 디자인 패턴 Pros vs Cons Pros 개발자간의 원활한 소통 소프트웨어 구조 파악이 용이 재사용을 통한 개발 시간 단축 설계 변경 요청에 대한 유연한 대처 Cons 객체지향 설계/구현 : 설계 및 구현에 대한 이해 필요 초기 투자 비용 부담 : 초기 설계 시간/비용적 부담 생성 패턴 (5/23) 객체를 생성하는 것과 관련... Read More
-
Part3 - CH1. 스프링 입문_객체지향
#객체지향 객체지향 4가지 핵심요소 캡슐화 상속 다형성 추상화 객체지향 설계 5원칙 (SOLID) SPR(Single Responsibility Principle) : 단일 책임 원칙 OCP(Open Closed Principle) : 개방 폐쇄 원칙 LSP(Liskov Subtitution Principle) : 리스코프 치환 원칙 ISP(Interface Segregation Principle) : 인터페이스 분리 원칙 DIP(Dependency Inversion Principle) : 의존 역전 원칙 응집도와 결합도 객체지향 설계 5원칙을 살펴보기 전에, 응집... Read More
-
Part2 - 객체지향 프로그래밍(5)
Inner Class, Lambda Expression, Stream Inner Class 클래스 내부에 구현한 클래스, 주로 외부 클래스 생성자에 내부 클래스를 생성 내부 클래스 유형 종류 구현 위치 사용할 수 있는 외부 클래스 변수 생성 방법 인스턴스 내부 클래스 외부 클래스 멤버 변수와 동일 외부 인스턴스 변수외부 전역 변수 외부 클래스를 먼저 만든 후 내부 클래스 생성 정적 내부 클래스 외부 클래... Read More
-
JS 정의되지 않은 객체나 변수로 조건걸기
어떠한 변수나 객체의 값 유무 혹은 true/false를 조건으로 걸고 싶을때 보통 다음과 같이 한다. 어떤 객체를 instance라고 하면, if(instance){ ... } 하지만 아직 해당 객체가 선언되지 않았을때가 존재할수 있고, 이를 조건으로 걸고 싶다면 다음과 같이 적용가능하다. if(typeof instance === "undefined"){ ... } Read More
-
Part2 - 객체지향 프로그래밍(4)
자료구조 간략 설명 컬렉션 프레임워크를 살펴보기 전에 자료구조에 대해 간략히 짚고 넘어가자. ArrayList vs LinkedList ArrayList : 물리적으로 주소가 붙어있는 구조. 자료에 대한 수정이 많지 않을 때 유리하다. LinkedList : 물리적으로 떨어져있지만 논리적으로 연결되어있는 구조. 자료에 대한 수정이 많을 때 유리하다. Stack vs Queue Stack : 후입선출 방식 (LIFO: Last Insert First Out) 으로 자료를 저장하는 자료구조 가장 늦게 들어온 자료가 가장 먼제 삭제됨 Queue : 선입선출 방식 (FIFO: First Inse... Read More
-
Part2 - 객체지향 프로그래밍(3)
String, Wrapper 클래스 String 클래스 선언 String str1 = new String("abc"); : 인스턴스로 생성됨 String str2 = "abc"; : 상수풀에 있는 문자열을 가리킴 //psvm String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1 == str2); //false String str3 = "abc"; String str4 = "abc"; System.out.println(str1 == str2); //true 생성자로 생성한 String... Read More
-
Part2 - 객체지향 프로그래밍(2)
Interface 인터페이스의 요소 추상메소드 상수 디폴트 메소드 : 인터페이스에서 선언만 되어있는것이 아니라 구현부도 있는 메소드. defualt키워드를 붙여서 정의하고, 해당 인터페이스를 구현하는 클래스에서 재정의 가능 (java8) 정적 메소드 : 인스턴스생성과 상관없이 인터페이스 타입으로 호출하는 메소드 (java8) private 메소드 : 인터페이스 내에서 사용하기 위해 구현한 메소드, 재정의 불가 (java9) public interface Interface{ // 1) 인터페이스에 선언된 변수 double PI = 3.14; int met... Read More
-
말하고 노래하는 핑크퐁 아기상어 비밀금고 (Pinkfong_Secret_Strongbox)
이 문서는 개발사업부 1팀 지각 벌금을 위해 구매한 핑크퐁 아기상어 비밀금고의 설명서입니다. 비밀금고 사용설명서 비밀번호 4자리를 정확하게 입력하면 LED등이 녹색으로 깜박이며 “손가락으로 지문 버튼을 눌러주세요” 하는 목소리가 나옵니다. 이때 지문인식버튼을 손가락으로 누르면 효과음과 함께 금고문이 자동으로 열립니다. 비밀번호를 잘못 누르면 “우잉~비밀번호를 다시한번 눌러주세요” 하는 목소리와 함께 빨간 불빛 오류 표시등이 깜박이고 금고문은 열리지 않습니다. 이때 다시한번 비밀번호를 올바르게 눌러주세요. 비밀번호 설정 초기 비밀번호는 [0000]입니다. 본인만의 비... Read More
-
Part2 - 객체지향 프로그래밍(1)
Variables Memory Stack Memory 함수호출시에 사용하는 메모리 공간 함수 호출이 종료되면 자동으로 메모리 반환 Heap Memory 인스턴스에서 멤버변수에 접근할때 사용하는 메모리 공간 각각의 인스턴스는 별개의 힙 메모리주소를 갖는다. 힙 메모리는 Garbage Collector가 알아서 정리한다. Constructor Defualt Constructor 선언된 생성자가 없다면 자바 컴파일러가 pre-compile단계에서 파라미터가 없는 기본 생성자를 만들어준다. Access Modifier 접근제어자라고 하며 변수, 메소드, 클래스 앞에 붙어... Read More
-
인텔리제이에서 자주쓰는 단축키 모음 (Intellij Shortcut)
맥OS기준으로 작성하였습니다. Symbol Description ⌘ Command key ⌃ Control key ⌥ Option or Alt key ⇧ Shift key ⌫ Delete key ↩ Return or Enter key ↑ Up arrow key ↓ ... Read More
-
Dboo's Blog 출시!
디부의 첫번째 포스트! 안녕하세요. 디부입니다. 개인 기술블로그를 하려고 여러가지 고민을 열심히 하다가 결국엔 깃허브에 첫 기술블로그를 개설하는 것으로 결정하게 되었습니다. 깃허브를 선택한 이유를 몇가지 꼽자면, 마크다운으로 작성하기 용이하다. 테마를 자유롭게 선택할 수 있고, 변경이 용이하다. 테마 수정을 자유롭게 할 수 있다. 깃허브에서 무료로 호스팅을 해준다. 깃허브 컨트리뷰션을 올리기 좋다.(꼼수?) 정도가 될 것 같습니다. 현재 선택한 테마는 Starry99님의 Catbook이라는 Jeckyll 테마입니다. Catbook 이제부터는 어떤 문체로 적어야할지, 어떤 카테고리를 만... Read More