강의 동영상 앞으로가기
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
동영상 10 초 앞으로 가기 나 뒤로 가기 안되나요? 강의 중간에 놓치면 처음부터 다시 듣고 있어서요
- java
- spring
- mvc
- spring-boot
173만명의 커뮤니티!! 함께 토론해봐요.
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
동영상 10 초 앞으로 가기 나 뒤로 가기 안되나요? 강의 중간에 놓치면 처음부터 다시 듣고 있어서요
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
PDF 문서 6번 11 페이지 마지막 부분 예제 소스의 주석 @PathVariable("userId") String userId -> @PathVariable userId 부분에서 "String" 타입명시가 빠졌습니다.
스프링 프레임워크는 내 손에 [스프2탄]
선생님 덕분에 좋은 회사에 취업해서 업무를 배우고있습니다~ 회사 입사 이후에도 퇴근 후 선생님의 좋은 강의를 계속 듣고 싶어서 문의드려요. 수강평에 3월쯤 오픈 예정이라고 답글 달려있는걸 보았는데 3월달에 다음강좌 오픈 확정인가요? 제가 선생님의 수업을 모두 들었지만 본의 아니게 Frontend로 가게되어 다음강의에 있는 React 부분이 너무 궁금해서 문의 남깁니다~~ 항상 감사합니다!
[NarP Series] MVC 프레임워크는 내 손에 [나프1탄]
현업에서 프로젝트 생성은 어디로 쓰이는지 궁금합니다.~! 전자정부프레임 워크로 생성하여 정부 프로젝트 참여를위해서 쓰인다는 이정도로 알고 있긴한데 ...만약 현업에서 프로젝트 생성해서 게시판을 만들경우 프로젝트 생성 과정중에 과거부터 현재 어트게 만들어져 왔는지 궁금해서 물어보게 된거라 ㅎㅎ 예를 들면 sts경우 에가시 프로젝트 mvc프로젝트 생성으로 만들엇다 > 아니면 이클립스 그래들 dao로 만들고 있다 현어으로 이렇거나 > 아니면 현재는 프로젝트 생성이 이클립스 그래들생성으로 dto로 만들다거나 과거부터 현재 어트게 되어있는지 궁금해요. ㅎ
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
application.properties에 다음 설정을 추가해주세요. logging.level.org.springframework.core.LocalVariableTableParameterNameDiscoverer = error 이 것은 Controller가 처음 실행될 때 나오는 로그인, WARN 10382 --- [nio-8080-exec-1] ocalVariableTableParameterNameDiscoverer : Using deprecated '-debug' fallback for parameter name resolution. Compile the affected code with '-parameters' instead or avoid its introspection: hello.springcoremvc211.controller.SpringUploadController 를 없애줍니다. 이것의 대한 자세한 내용은 https://github.com/spring-projects/spring-framework/issues/29612 에 있으며, Spring 6.0.3에서 고쳐지는 내용입니다.
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
삭제된 글입니다
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요. 정리 강의를 들으면서 Filter를 스프링 빈으로 등록하는 방법을 따라하다 버전 차이인지, 스프링 부트의 설정 차이인지, 에러가 발생하더군요. The bean 'logFilter', defined in class path resource [hello/springcoremvc26/config/FilterConfig.class], could not be registered. A bean with that name has already been defined in file [/project/java/spring/spring-core-mvc2-6/out/production/classes/hello/springcoremvc26/web/filter/LogFilter.class] and overriding is disabled. 이유를 읽어보니, logFilter가 이미 빈으로 등록되어서 중복 등록이 안된다고 써져있었습니다. 그래서 이에 대해 찾아본 결과를 공유하고자 글을 작성합니다. 아래 글은 제 블로그 에도 정리되어 있습니다. (홍보...ㅎㅎ..) @Configuration LogFilter - 로그 필터 @Slf4j public class LogFilter implements Filter { @Override public void init( FilterConfig filterConfig ) throws ServletException { log.info("LogFilter init()"); } @Override public void destroy() { log.info("LogFilter destroy()"); } @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); log.info("[{}] LogFilter doFilter Start", requestURI); try { chain.doFilter(request, response); } finally { log.info("[{}] LogFilter doFilter End", requestURI); } } } LoginCheckFilter - 로그인 필터 @Slf4j public class LoginCheckFilter implements Filter { @Override public void init( FilterConfig filterConfig ) throws ServletException { log.info("LoginCheckFilter init()"); } @Override public void destroy() { log.info("LoginCheckFilter destroy()"); } @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); log.info("[{}] LoginFilter doFilter Start", requestURI); try { chain.doFilter(request, response); } finally { log.info("[{}] LoginFilter doFilter End", requestURI); } } } FilterConfig - Filter 등록 @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<Filter> logFilter() { FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>(); bean.setFilter(new LogFilter()); bean.setOrder(1); bean.addUrlPatterns("/*"); return bean; } @Bean public FilterRegistrationBean<Filter> loginCheckFilter() { FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>(); bean.setFilter(new LoginCheckFilter()); bean.setOrder(2); bean.addUrlPatterns("/*"); return bean; } } 실행 결과 [/] LogFilter doFilter Start [/] LoginFilter doFilter Start [/] LoginFilter doFilter End [/] LogFilter doFilter End 특징 강의에서 나온 방법입니다. 설정을 위한 별개의 파일( @Configuration 이 붙은 객체)이 필요합니다. setOrder() 를 통해 순서를 정할 수 있습니다. addUrlPatterns() 을 통해 베이스 URL 및 Whitelist를 설정할 수 있습니다. @Component LogFilter @Slf4j @Component @Order(1) public class LogFilter implements Filter { @Override public void init( FilterConfig filterConfig ) throws ServletException { log.info("LogFilter init()"); } @Override public void destroy() { log.info("LogFilter destroy()"); } @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); log.info("[{}] LogFilter doFilter Start", requestURI); try { chain.doFilter(request, response); } finally { log.info("[{}] LogFilter doFilter End", requestURI); } } } LoginCheckFilter @Slf4j @Component @Order(2) public class LoginCheckFilter implements Filter { @Override public void init( FilterConfig filterConfig ) throws ServletException { log.info("LoginCheckFilter init()"); } @Override public void destroy() { log.info("LoginCheckFilter destroy()"); } @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); log.info("[{}] LoginFilter doFilter Start", requestURI); try { chain.doFilter(request, response); } finally { log.info("[{}] LoginFilter doFilter End", requestURI); } } } 실행 결과 [/] LogFilter doFilter Start [/] LoginFilter doFilter Start [/] LoginFilter doFilter End [/] LogFilter doFilter End 특징 컴포넌트 스캔을 이용하기 때문에 설정을 위한 별개의 파일이 필요하지 않습니다. @Order 애노테이션을 이용해 순서를 설정할 수 있습니다. 기본 URL Pattern이 /* 이며 설정할 수 없습니다. @WebFilter + @ServletComponentScan LogFilter @Slf4j @WebFilter public class LogFilter implements Filter { @Override public void init( FilterConfig filterConfig ) throws ServletException { log.info("LogFilter init()"); } @Override public void destroy() { log.info("LogFilter destroy()"); } @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); log.info("[{}] LogFilter doFilter Start", requestURI); try { chain.doFilter(request, response); } finally { log.info("[{}] LogFilter doFilter End", requestURI); } } } LoginCheckFilter @Slf4j @WebFilter public class LoginCheckFilter implements Filter { @Override public void init( FilterConfig filterConfig ) throws ServletException { log.info("LoginCheckFilter init()"); } @Override public void destroy() { log.info("LoginCheckFilter destroy()"); } @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); log.info("[{}] LoginFilter doFilter Start", requestURI); try { chain.doFilter(request, response); } finally { log.info("[{}] LoginFilter doFilter End", requestURI); } } } MainApplication @ServletComponentScan @SpringBootApplication public class MainApplication { public static void main(String[] args) { SpringApplication.run(SpringCoreMvc26Application.class, args); } } 실행 결과 [/] LogFilter doFilter Start [/] LoginFilter doFilter Start [/] LoginFilter doFilter End [/] LogFilter doFilter End 특징 설정을 위한 별개의 파일이 필요하지 않습니다. 대신, 애플리케이션 실행되는 메인 객체위에 @ServletComponentScan 을 사용해야 합니다. @Order 를 이용한 순서 등록을 사용할 수 없습니다. 각 필터에 대한 순서를 보장할 수 없습니다. @WebFilter 의 value 나 urlPatterns 파라미터를 이용해 whitelist 방식으로 베이스 URL을 설정할 수 있습니다. @WebFilter("/filter/*") @WebFilter({"/login", "/items"}) @WebFilter(urlPatterns = "/filter/*") @WebFilter(urlPatterns = {"/login", "/items"}) @WebFilter + @Component LogFilter @Slf4j @WebFilter @Component @Order(1) public class LogFilter implements Filter { @Override public void init( FilterConfig filterConfig ) throws ServletException { log.info("LogFilter init()"); } @Override public void destroy() { log.info("LogFilter destroy()"); } @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); log.info("[{}] LogFilter doFilter Start", requestURI); try { chain.doFilter(request, response); } finally { log.info("[{}] LogFilter doFilter End", requestURI); } } } LoginCheckFilter @Slf4j @WebFilter @Component @Order(1) public class LoginCheckFilter implements Filter { @Override public void init( FilterConfig filterConfig ) throws ServletException { log.info("LoginCheckFilter init()"); } @Override public void destroy() { log.info("LoginCheckFilter destroy()"); } @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); log.info("[{}] LoginFilter doFilter Start", requestURI); try { chain.doFilter(request, response); } finally { log.info("[{}] LoginFilter doFilter End", requestURI); } } } 실행 결과 [/] LogFilter doFilter Start [/] LoginFilter doFilter Start [/] LoginFilter doFilter End [/] LogFilter doFilter End 특징 두 번째 방법과 세 번째 방법을 모두 사용하는 방법입니다. 설정을 위한 별개의 파일이 필요하지 않습니다. 컴포넌트 스캔 방식을 사용하기 때문에 @ServletComponentScan 도 필요없습니다. @Order 애노테이션을 이용해 순서를 설정할 수 있습니다. @WebFilter 의 value 나 urlPatterns 파라미터를 이용해 베이스 URL이나 Whitelist 방식으로 설정할 수 있습니다. @WebFilter("/filter/*") @WebFilter({"/login", "/items"}) @WebFilter(urlPatterns = "/filter/*") @WebFilter(urlPatterns = {"/login", "/items"}) 애노테이션이 기본으로 3개가 필요합니다. 정리 결론 필터를 사용하기 위한 4가지 방식을 알아보았습니다. 첫 번째 방법( @Configuration + FilterRegistrationBean )과 두 번째, 세 번째 방법을 합친 네 번째 방법( @WebFilter + @Component ) 중에서 고려하면됩니다. 저의 경우에는 @Configuration + FilterRegistrationBean 을 더 맘에 드는 데, 이유는 Filter Class 위에 애노테이션을 여러개 붙이는 것 보다, 별도의 생성 파일을 하나 만들어서 관리하는게 더 편할 것 같아서였습니다. 하지만, @WebFilter + @Component 은 스프링 빈으로 등록하는 방법 이기에, 다른 스프링 빈을 의존성 주입 받을 수 있습니다. 그런 경우에는 첫 번째 방법으론 할 수 없으니, 네 번째 방법을 사용하면 될 것 같습니다.
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
설명 PathPattern 공식 문서 ? : 한 문자 일치 /pages/t?st.html YES: /pages/test.html , /pages/tXst.html NO : /pages/toast.html * : 경로( / ) 안의 모든 문자 일치 /resources/*.png YES: /resources/photo.png NO : /resources/favority.ico ** : 하위 경로 모든 문자 일치 /resources/** /resources/image.png , /resources/css/spring.css {spring} : spring 이라는 변수로 캡처 /resources/{path} /resources/robot.txt -> path 변수에 "robot.txt" 할당 @PathVariable("path") 로 접근 가능 {*spring} : 하위 경로 끝까지 spring 변수에 캡쳐 /items/{*path} /items/1/add -> path 변수에 "/1/add" 할당 {spring:[a-z]+} : 정규식 이용 /items/{path:[a-z]+} YES: /items/robots NO : /items/123 예제 1 - {*spring} @GetMapping("/hello/{*name}") @ResponseBody public String handleTest( @PathVariable String name ) { log.info("name = {}", name); return name; } GET http://localhost:8080/hello/path-test -> name = /path-test === GET http://localhost:8080/hello/path-test/other -> name = /path-test/other 예제 2 - 정규식 @GetMapping("/static/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}") @ResponseBody public String handle( @PathVariable String name, @PathVariable String version, @PathVariable String ext ) { log.info("name = {}", name); log.info("version = {}", version); log.info("ext = {}", ext); return "/" + name + "/" + version + "/" + ext; } GET http://localhost:8080/pathtest-1.0.0.jar -> name = pathtest version = 1.0.0 ext = .jar 잘못된 사용 @GetMapping("/static/{*fullpath}{name}") @ResponseBody public String runtimeError( @PathVariable String fullpath, @PathVariable String name ) { log.info("fullpath = {}", fullpath); log.info("name = {}", name); return name; } Description: Invalid mapping pattern detected: /static/{*fullpath}{name} ^ No more pattern data allowed after {*...} or ** pattern element {*...} 또는 ** 패턴 요소 다음에는 다른 패턴 데이터 를 사용할 수 없습니다.
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
pathVarible -> pathVariable a가 빠진 것을 발견했습니다.
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
개발하다보면 실무에서도 아키텍쳐를 변경해야할 때가 있다. 이 때, 구조를 수정할 때는 구조만 건들여야 한다. 수정하다보면 구조말고도 디테일한 부분이 눈에 밟혀 수정하고 싶은 충동이 생기는데, 그때 한 번에 개선을 하게 되면 다른 사람이 처리하는데도 힘들고, 사람이 다 기억하기도 힘들다. 그러니, 디테일한 것이 보여도 TODO 리스트에 적은 다음 넘어가고, 큰 구조를 먼저 변경이 완료된 후, 테스트까지 완료되면 커밋하고 나서 디테일한 것을 변경하자. 말씀을 듣자마자 과거에 경험했던 일들이 주마등처럼 스쳐 지나갔습니다... ㅋㅋㅋㅋ... 이 문구를 따로 저장해서 마음 속 깊이 새기도록 하겠습니다.
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강의 9분에서 진행되던 파라미터를 Response에 다시 돌려주던 부분에서 저는 왜 에러 페이지가 뜰까 고민하다가 발견한 것을 정리했습니다. 강의 처음부터 service 메소드를 오버라이딩할 때 super.service(req, resp); 가 없었지만 Ctrl + Shift + A 를 통해 자동으로 생성할때에는 저 한 줄이 자동으로 붙습니다. 이를 제거해주지 않으면 에러페이지가 표시되고, 응답은 405로 표시됩니다. 저 코드의 의미는 부모 클래스의 service 메소드를 실행하라라는 의미인데, 들어가보면 아래의 코드를 만날 수 있습니다. if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince; try { ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); } catch (IllegalArgumentException iae) { // Invalid date header - proceed as if none was set ifModifiedSince = -1; } if (ifModifiedSince < (lastModified / 1000 * 1000)) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } } 나름 해석해보면 GET 요청이 올 때, doGet 메소드로 보내는 것을 확인할 수 있고, doGet 메소드는 아래와 같습니다. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String msg = lStrings.getString("http.method_get_not_supported"); sendMethodNotAllowed(req, resp, msg); } 코드를 보면 상속을 하지않은 원형 doGet 메소드는 405코드로 바로 응답하도록 작성되어 있는 것을 확인할 수 있습니다. 이를 해결하는 방법은 2가지가 있습니다. 상속받은 HelloServlet의 service 메소드에서 super.service(req, resp) 를 제거하는 것. 상속받은 HelloServlet에 doGet 메소드를 추가로 오버라이딩해서 그곳에 Response를 조작하는 코드를 작성하는 것이 있습니다. 이에 해당하는 방법의 코드는 아래와 같습니다. @WebServlet(name = "helloServlet", urlPatterns = "/hello") public class HelloServlet extends HttpServlet { @Override protected void service( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { super.service(req, resp); System.out.println("HelloServlet.service"); System.out.println("req = " + req); System.out.println("resp = " + resp); } @Override protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws IOException { // 파라미터 획득 String userName = req.getParameter("username"); System.out.println("userName = " + userName); // Response Header 설정 resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); // Response resp.getWriter().write("hello " + userName); } }
CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조
등차수열의 합 보다는 조합으로 설명하셔도 좋을 것 같아요. n개의 노드가 서로서로 연결하는 개수는 n개중에 연결되는 2개의 노드를 선택하는 경우의 수랑 같다고 하셔도 좋을 것 같아요. nC2 = n (n-1) / 2
CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조
어떻게 읽는 지 전혀 모르겠어서 찾아봤습니다. 얻제이쓴씨 뭐 이런 식으로 읽는데요.. 길 가다 json씨를 만났습니다. 그리고 반갑게 인사를 합니다. 엇 json씨
스프링 부트 웹 개발 입문 - 따라하며 배우기
정말 너무 좋습니다 ㅠㅠ 그동안 이해가 안되었던 부분들을 너무 쉽게 설명해주셔서 잘 따라가고 있어요! 동네 개발자 형이 옆에서 알려주는듯한 느낌.. ㅋㅋ 좋은 강의 감사드립니다!
CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조
큰돌툰 폼 미쳤다..
CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조
안녕하세요 큰돌님 다름이 아니라 2달내 수강완료시 포폴첨삭 이벤트를 진행하시잖아요? 근데 포폴 첨삭을 어느 시기에 부탁드리는게 맞는지 고민되어 질문드립니다 일단 저는 웹 프론트엔드를 지망하고있습니다 그리고 저는 지금 js강의를 듣고 있고 1달후엔 대략적으로 react를 다룰 수 있을 것 같아 실질적으론 3월 중순부터 포폴제작에 들어갈 것 같습니다 그래서 포폴제작은 4월 중후반쯤에 대략적인 완성이 되리라 예측합니다 다만 저는 1개의 포폴을 기반으로 node js ,mongo db등을 학습해나가며 간단한 백엔드 시스템 구축 및 알고리즘 학습하며 코드 리팩토링등 1개의 포폴을 계속 업그레이드 해나가며 완성도 높은 포폴 만드는것을 목표로하고 있는데 제 생각엔 하반기쯤 되어서야 제대로 된 포폴을 완성할 것 같아서 그 때 큰돌님께 검수를 받고 개선점을 찾는게 맞는지 react로 대략적인 구성을 한 다음 검수를 받고 대략적인 방향을 가이드 받는것이 맞는지 고민되어서 질문드립니다
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
vscode 라서그런가요 hello!! 가 안되네요 다른거 다똑같이했는데 ㄷ
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
현재 국비 학원을 수료하며 프로젝트를 마친 뒤에 김영한님 강의를 듣고 있으며 spring에 대해 이제서야 이해하려 하는 취준생입니다. 문득 제가 어떤 개발을 하고 싶은지 방향성에 대해 생각해보게 되었습니다. ->어떤 개발을 하고 싶은지 방향성에 대해 되짚어 보고 있었다 ->SQL문을 짜면서 효율적인 방법은 무엇이 있을까 고민하는 과정이 스스로 가치 있는 고민을 하고 있다는 생각이 들었다. ->데이터 처리 속도 개선에 관하여 고민하는 개발자가 되고 싶다. ->대용량 트래픽을 다루는 서비스 회사에서 성장하고 싶다. 질문 ==> 위의 4문장을 설득력 있게 말하기 위해서 취준에 뛰어드는 예비 백엔드 개발자 수준에서 할 수 있는 "공부 방향"은 무엇이 있을지 조언 해주실 수 있을까요? (특정 개념이나 강의를 추천해주셔도 감사할 것 같습니다. )
누구보다 뛰어난 개발자 되는 법, 하루에 하나씩 CS 정복하기! 개발 한 스푼 https://adevspoon.page.link/XJYS https://adevspoon.page.link/XJYS 개발 공부, CS 공부 등등 개발자가 되기까지 해야할 공부가 너무 많지 않나요? 개발자 취업, 면접, 이직 어떻게 준비해야할지, 비전공 개발자인데 어디서부터 시작해야할지 모르겠다구요? 개발 한 스푼이 도와드립니다! 하루에 하나씩 IT 기술면접 질문 제공받고 공부해가며 Computer Science 정복해봐요! 자료구조, 알고리즘, 네트워크, 운영체제, 데이터베이스까지 방대한 CS 지식을 가볍게 차근차근! 질문에 답변하고, 도움이 된 답변을 모아보고, 받은 질문을 모아보며 복습까지. 오늘부터 하루에 딱 하나씩만! 지금 바로 시작해보세요
https://adevspoon.page.link/XJYS 개발 공부, CS 공부 등등 개발자가 되기까지 해야할 공부가 너무 많지 않나요? 개발자 취업, 면접, 이직 어떻게 준비해야할지, 비전공 개발자인데 어디서부터 시작해야할지 모르겠다구요? 개발 한 스푼이 도와드립니다! https://adevspoon.page.link/XJYS 하루에 하나씩 IT 기술면접 질문 제공받고 공부해가며 Computer Science 정복해봐요! 자료구조, 알고리즘, 네트워크, 운영체제, 데이터베이스까지 방대한 CS 지식을 가볍게 차근차근! 질문에 답변하고, 도움이 된 답변을 모아보고, 받은 질문을 모아보며 복습까지. 오늘부터 하루에 딱 하나씩만! 지금 바로 시작해보세요