이야기를 나눠요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Filter를 등록하는 4가지 방법
안녕하세요. 정리 강의를 들으면서 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가 이미 빈으로 등록되어서 중복 등록이 안된다고 써져있었습니다.그래서 이에 대해 찾아본 결과를 공유하고자 글을 작성합니다. 아래 글은 제 블로그에도 정리되어 있습니다. (홍보...ㅎㅎ..)@ConfigurationLogFilter - 로그 필터@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를 설정할 수 있습니다.@ComponentLogFilter@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 + @ServletComponentScanLogFilter@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 + @ComponentLogFilter@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은 스프링 빈으로 등록하는 방법이기에, 다른 스프링 빈을 의존성 주입 받을 수 있습니다. 그런 경우에는 첫 번째 방법으론 할 수 없으니, 네 번째 방법을 사용하면 될 것 같습니다.
-
스프링 DB 2편 - 데이터 접근 활용 기술
내부 트랜잭션이 여러 개 있을 때 롤백 실험
내부 트랜잭션이 여러 개 있을 때 앞쪽 내부 트랜잭션이 롤백될 경우 이후의 내부 트랜잭션은 로직을 수행하는지, 아니면 이후 로직은 수행되지 않고 바로 물리 트랜잭션을 롤백시키는지 의문이 들어 확인해보았습니다. 구조외부 트랜잭션내부 트랜잭션 1내부 트랜잭션 2 코드: 내부 트랜잭션1 - 롤백, 내부 트랜잭션2 -커밋결과결과를 확인해보면 내부 트랜잭션1을 롤백하는 코드가 실행될 때 물리 트랜잭션을 rollback-only로 마킹하고 해당 내부 트랜잭션이 실패합니다. -> 트랜잭션 동기화 매니저에 마킹을 합니다.(이후 강의 내용)하지만 이후 로직을 수행하러 갑니다.수행하러 가서 내부 트랜잭션2 커밋 호출문을 만나면 글로벌(물리) 트랜잭션이 rollback-only로 마킹되어있기 때문에 커밋할 수 없다고 합니다. 계속 가서 마지막에 외부 트랜잭션 커밋이 호출되면 UnexpectedRollbackException 예외가 발생하면서 "rollback-only로 마킹되어있기 때문에 해당 트랜잭션은 롤백되었다"는 로그가 뜹니다. 해당 예외의 조상에는 발생시 트랜잭션이 롤백되는 RuntimeException 예외가 있었습니다. 결론내부 트랜잭션 수행 중 롤백 발생시에 바로 물리 트랜잭션이 롤백되는게 아니다.물리 트랜잭션 -> 트랜잭션 동기화 매니저가 rollback-only의 체크 유무로 롤백 여부를 판단하고, 예상치 못한 상황(rollback-only 마킹돼 있는데 물리 트랜잭션을 커밋하려고 할 때)에서 UnexpectedRollbackException을 발생시켜 롤백을 수행한다. 아직 모르는게 많아서 결론이 맞지 않을 수도 있습니다! 이후 강의를 수강하면서 부족한 점을 채우러 가겠습니다~!
-
✨스위그(SWYG)에서 메타 콘텐츠를 찾습니다✨
메타 콘텐츠 공유 및 호스팅 플랫폼 스위그(SWYG)에서 메타 콘텐츠를 찾습니다!*메타 콘텐츠는 심리테스트, 온라인 방탈출, 인터랙티브 웹, 온라인 전시, 미니게임 등 코딩을 기반으로 만들어진 웹 콘텐츠입니다.‘스위콘’ 이란?제작해 둔 메타 콘텐츠가 있지만 아직 배포하지 않았거나 자체 도메인이 없는 메타 콘텐츠를 SWYG에서 복잡한 절차와 비용 없이 쉽고 빠르게 배포할 수 있는 프로그램입니다. SWYG에서는 위와 같은 메타 콘텐츠를 깃허브 연동 후 ‘배포 버튼’ 클릭 한 번으로 배포가 가능합니다. 또 원하는 도메인을 제공하고, 광고를 부착할 수 있어 수익 창출까지 가능합니다.이런 콘텐츠도 가능한지 고민이 되신다구여❓- 처음 만들어본 것도 가능할까?- 한 페이지인데 상관없을까?- 디자인이 예쁘지 않은데 괜찮을까?- 콘텐츠가 별로인 것 같은데 괜찮을까?- 콘텐츠로 수익을 창출할 수 있을까?위에 해당되는 콘텐츠도 모두 오케이 👌※ 선정적이거나 폭력성, 사행성 요소가 많이 포함된 콘텐츠는 출시가 불가능할 수 있습니다.🤷왜 스위그에서 출시를 해야 하나요?🔥콘텐츠 출시 Benefit🔥- 웹 호스팅 및 도메인 제공- 복잡한 심사 절차 없이 광고 부착 가능- 트래픽이 많이 발생할 수 있도록 전담 마케팅 제공- 사용자 유입 데이터 제공- 스위그의 자동 SEO를 통한 검색엔진 최상단 노출 가능- 콘텐츠의 고도화를 위한 인프라 지원👉 혜택 자세히 알아보기 https://swyg.link/h5j_0📅 일정- 지원 마감: ~ 2/21(화)- 콘텐츠 등록 결과 안내 : 2/23(목) 15:00📌 지원서https://swyg.link/A5YV9✨[SWYG 요약 소개]✨SWYG에서 심리테스트, 미니게임, 인터랙티브 콘텐츠와 같은 특색 있는 메타 콘텐츠를 즐기고, 직접 만든 콘텐츠를 호스팅하여 많은 사용자들을 유입시킬 수 있습니다.🔗SWYG 홈페이지https://www.swygbro.com🔗SWYG 인스타그램https://www.instagram.com/swyg_official🙋문의Kakao: https://open.kakao.com/me/swyg_contentEmail: shlee@swygbro.com
-
2023 USG+ AI·데이터 문제해결 제조혁신 경진대회 ~ 3월 6일 접수마감
○ 참가 안내- 대회 및 참가 안내 : https://aifactory.space/competition/detail/2261 ○ 개요- USG+ 참여대학 소속 학생들을 대상으로 제조혁신을 위한 제조 AI·데이터를 활용하여 제조현장의 제조성공 여부, 불량률 예측분석 등 제조 ICT 모델 개발 및 적용 과제를 운영합니다.- USG+ (University System of Gyeongnam + Ulsan)는 경남과 울산지역의 대학, 기업, 지자체가 협력하여 만든 공유형 대학으로 학교·학과의 장벽을 없애고 모든 대학을 하나의 캠퍼스처럼 공유하는 교육시스템- 소속대학(17개) : 경상국립대학교, 경남대학교, 창원대학교, 인제대학교, 울산대학교, 영산대학교, 경남도립거창대학교, 경남도립남해대학교, 창원문성대학교, 마산대학교, 거제대학교, 동원과학기술대학교, 연암공과대학교, 진주보건대학교, 김해대학교, 한국승강기대학교, 울산과학대학교 ○ 추진배경- 울산∙경남 지역의 제조업 혁신을 위한 제조ICT 산업의 육성을 위해 ICT/SW융합 응용 기술을 개발할 수 있는 직무역량, 현장 문제해결 역량의 실무 능력을 갖춘 혁신 인재를 육성하고자 합니다. ○ 대회 목적- 울산∙경남의 제조혁신을 위해 AI·데이터를 발굴하고 USG+ 참여대학 소속 참가자들이 AI·데이터 기술을 활용해 제조 현장의 문제를 해결하고자 합니다. ○ 주최/주관/운영- 주최·주관: (재)경남테크노파크, 울산·경남지역혁신플랫폼 스마트제조ICT사업단- 운영: 인공지능팩토리 ○ 참가대상- 참가대상: USG+ 소속대학을 포함한 울산∙경남 지역 대학 재학생 누구나 (대학원생 포함)- 팀(2인 이상 최대 4인), 최소 2인 이상 (✽팀 빌딩은 참가신청 이후에 태스크 내에서 진행하실 수 있습니다)- (필수) 팀 구성시 USG+ 소속대학 학생 2인 이상 참여 필수- 대회 문제 : 출제 문제 및 평가지표는 경진대회 오픈 시 공개 ○ 기간 및 일정 (UTC+ 9(한국) 기준)- 접수기간: 2. 20.(월) ~ 3. 6.(월) 20:00 까지- 온라인설명회: 3. 7.(화) 17:00- 온라인설명회 링크: https://youtube.com/live/PL9CKeFIiXk?feature=share- 대회기간: 3. 8.(수) 15:00 ~ 3. 13.(월) 17:00 까지- 심사기간: 3. 14.(화) ~ 3. 21.(화)- 수상 발표: 3. 21.(화) 17:00 이후- 시상식: 4. 13.(목)(예정)※ 상기일정은 원활한 대회운영을 위해 일부 조정될 수 있습니다. ○ 시상내역 (총 8개팀 선발, 참가자 모두에게 기념품 제공)- 대상(1팀): 경남대학교 총장상- 최우수상(2팀): 경남대학교 총장상- 우수상(2팀): 울산·경남지역혁신플랫폼 총괄운영센터장상- 장려상(3팀): 울산·경남지역혁신플랫폼 총괄운영센터장상 ○ 문의- 울산·경남지역혁신플랫폼 스마트제조ICT사업단: oouooya@kyungnam.ac.kr / ☏ 여성일 T. 055-259-5983
-
CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조
포트폴리오 첨삭 이벤트 신청했습니다!
삭제된 글입니다
-
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
PathPattern에 대한 몇가지 예시입니다.
설명PathPattern 공식 문서?: 한 문자 일치/pages/t?st.htmlYES: /pages/test.html, /pages/tXst.htmlNO : /pages/toast.html*: 경로(/) 안의 모든 문자 일치/resources/*.pngYES: /resources/photo.pngNO : /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/robotsNO : /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{*...} 또는 ** 패턴 요소 다음에는 다른 패턴 데이터를 사용할 수 없습니다.
-
실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
동적 페이지의 크롤링 강의도 추가될 계획이 있으신가요??
실무에서 하다보니 상당히 많은 사이트들이 동적 페이지라서 셀레니움을 사용해야만 하는 경우가 많습니다그런데 셀레니움 반복적으로 사용하니 컴퓨터가 느려지는 효과를 경험하고 있습니다...json 데이터를 가져오는 법을 배워보고 싶은데 향후 강의에 추가될 계획이 있으신지요? :))
-
UIKit - iOS14 실무 가이드 <iOS앱 진짜 개발자 되기>
MovieApp 빌드 시 UISearchDisplayController... 에러 나시는 분들 참고
MovieApp 빌드 할 때UISearchDisplayController is unavailable when deploying to iOS 13.0 or later이런 에러 나온다면,storyboard에서 해당 아이콘 중에 'UISearchDisplayController'이 있는지 보시고 삭제하시면 빌드 됩니다.(삭제는 storyboard오른쪽에 View Controller Scene 하단에 있는 'UISearchDisplayController'을 클릭하고 back space 누르시면 됩니다.) 에러의 이유는 13이후 버전에서는 아예 없어진 것인데 붙어있어서 빌드가 안되는 것 같았습니다. 혹시 나중에 터질지는 모르겠지만, 제가 찾아봤을 때 뾰족한 해결법이 없어서 일단 공유 해봅니다.
-
선배님들, 부트캠프 하차 후 국비지원... 괜찮을까요?
현재 온라인 부트캠프에서 구르고 있는 백수입니다.사전에 아무런 준비도 없이 무턱대고 부트캠프에 들어가서 한달 넘게 식겁했습니다.지금은 겨우 적응해서 중상위권 성적으로 간신히 버티는 중 입니다.그런데 진도가 너무 빨라서 머리에 남는게 없을까봐 너무 두렵습니다.이대로면 취업하고도 일을 돕기는 커녕 민폐나 끼치지 않을까 걱정이 앞섭니다. 그래서 일부를 제한 수강료를 환불 받고 현재 부트캠프에서 하차한 후에3월이나 4월에 시작하는 온라인 국비지원 부트캠프로 옮기는 것을 고려하고 있습니다.취업이 다소 늦어지더라도 국비지원을 받을테니 비용 측면에서는 피차일반이지만,제가 온전히 공부만 할 수 있는 기간을 조금 더 늘릴 수 있다는 이점이 있습니다. 한 달 남짓 기간이 있는 만큼 독학으로 기본기를 좀 더 다지고 싶다는 마음이 커지고 있습니다.이런 이유로 인프런 강의를 통한 독학과 국비지원 부트캠프를 병행하고자 합니다. 제가 어린 나이라면 고민없이 후자를 택하겠지만,나이도 먹을 만큼 먹은 상태여서 올해 하반기 취업시장을 놓치는데 대한 아쉬움도 큽니다.그래서 결정을 내리지 못 하고 고민을 거듭하고 있습니다. 선배님들이 보시기엔 어떤가요?이러한 전학(?)은 미친 짓일까요?진심 어린 조언을 간곡히 부탁드립니다. (_ _)
-
CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조
순수(바닐라) 자바스크립트에서 외부 api key를 은닉할 수 없을까요?
open api 강의를 듣고, open api 찾아서 간단한 앱을 만들어 보려고 하는데, api key가 있더라구요. 그래서 회원가입을 하고 키를 발급받은 후 fetch 를 통해서 데이터를 받아와서 만들긴 했는데, 갑자기 이 생각이들더라구요. api key는 은닉이 되어야 하는게 맞지 않나? 라는거요 (사실 리액트 ,뷰 같은 라이브러리 혹은 프레임워크를 사용하면 배운대로 자연스레 하는 것이지만, 자바스크립트 자체적으로 건드려 본 적은 없다는 사실을 깨달았어요.). 그 후 은닉을 어떻게 하면 할 수 있는가 찾아봤는데, 서버 측에서 가능한 dotenv 를 다운 받아서 쓰거나 아니면 무료로 도메인을 등록해주는 사이트 자체의 옵션을 건드려서 하는 방법(서버리스?)은 있는데, 순수 자바스크립트 자체적으로 하는 방법은 안 보이더라구요. 결론적으로 순수 자바스크립트 자체만으로 , 발급 받은 api key를 은닉할 수는 없는 걸까요?
-
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
코팩님 지도 관련 재밌어요!!!
지도 강의에서 재밌으면 댓 남겨달라고 하신걸 듣고댓글 남겨요더 추가 원해요!아주 api사용 하는거 재밌어요
-
엑셀로 끝내는 보고서 차트 실무 강의
좋은 강의,,,,
정말 좋은 강의였습니다.다음에도 좋은 강의 부탁드립니다.
-
[입문] Qt 6 프로그래밍 2편
내부에서 사용할 용도로 만들면 라이센스가 어떻게 되는지요
그냥 단순 궁금해서 질문합니다.만약에 회사에서 판매 목적이 아니고 내부에서만 사용할 용도로 만든 프로그램은 라인센스가 어떻게 되는지 문의합니다.
-
결제 서비스 개발할 때 쓰이는 기술
전 아임포트API로 기능 연동 정도만 경험해본 교육생입니다.구현한 기능 수준은 결제 정보에 대한 검증이나 보안과정이 없는 수준인데요.자소서를 쓸 때 결제 서비스 구현에 대한 역량을 고도화하고 싶다는 말을 설득력있게 하고 싶습니다. 이를 위해 결제 파트 맡으시는 현업자분들이 따로 공부하는 것은 어떤게 있을까요? (특정 툴? 특정 라이브러리? 특정 개념?) ex) 성능 테스트를 위해 ngrinder를 사용한다던지, 보안을 위해 spring security 공식문서를 읽어본다던지
-
1
1
-
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
손코딩 이후 코드 작성하는 방법
안녕하세요! 강의 잘 듣고 있는 학생입니다. 선생님 저 같은 경우 코딩 테스트 문제를 풀때, 컴퓨터(IDE)에 바로 작성하지 않고 노트에 solution 부분의 코드를 전부 손코딩으로 작성 해본 뒤에 컴퓨터로 작성합니다. 이런 방식이 코딩테스트 시험 볼때는 시간제한이 있으니,, 비효율적인지 궁금합니다. (현재는 코드가 짧아서 상관 없다고 생각하지만, 어려운 문제들.. 즉, 코드가 길어 지는 문제들을 풀때 문제가 되지 않을까? 생각하여 이렇게 질문을 남깁니다) 이렇게 하게 된 이유는, 펜으로 작성해보지 않고 바로 코드를 타이핑 하려니 생각이 잘 떠오르지 않아 이렇게 하게 되었습니다.
-
함수형 프로그래밍과 JavaScript ES6+
세상에서 제일 신기한 기본기..
이것도 모르고 js를 써왔던 내 인생이 레전드네요..
-
[리뉴얼] 코딩자율학습 제로초의 자바스크립트 입문
셀프 체크 - 연달아 계산하기 과제가 너무 어렵습니다.
마이너스를 해보려고 했는데 이제 자스를 배우는데 도저히 어떻게 해야지 그게 되는지도 모르겠습니다. 제가 소질이 없는걸까요? 대체 뭘 어떻게 해야지 앞에 마이너스를 추가해서 하는건지 전혀 모르겠습니다
-
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
H2를 최신버전(현재는 2.1.214)으로 사용 시 오류 임시 해결 방법
안녕하세요.다름 아니라 Spring Boot가 3.XX 버전으로 업데이트가 되면서, 해당 버전을 사용하시는 분들은 1.3.176버전으로 H2 이용 시 404에러가 발생합니다.해당 에러를 해결하려면 최신 버전으로 H2를 사용하여야 하는데요. 최신 버전으로 H2를 사용하면 1.3.176 이하 버전처럼 db가 자동 생성 되지 않습니다. 그래서 해결 방법을 찾았는데요. 이 방법은 제가 어떻게 어떻게 하다 보니 발견한 방법이라서 옳다고 할 수는 없겠지만, H2를 테스트용으로만 사용하기 때문에 띄우기만 하면 되므로 문제 없을 것 같아 공유드립니다. 우선 pom.xml에서 h2 dependency를 추가하였다면, 아래 이미지처럼 왼쪽 프로젝트 창의 External Libraries 리스트에서 h2를 찾을 수 있습니다.해당 h2 jar파일을 우클릭하면 탭이 뜨는데 Open Library Settings(F4)를 선택하면 h2 jar 파일의 위치를 확인할 수 있습니다.그럼 해당 위치로 가셔서 jar파일을 더블 클릭하여 실행시키면 브라우저에서 H2 콘솔이 실행됩니다.(h2 jar 파일 우클릭 시 탭에서 Open in > Directory Path(Ctrl + Alt + F12)를 선택하면 Show Explorer탭이 뜨고, jar 파일 선택하면 폴더로 바로 이동 됩니다)이 때 우측 하단의 트레이를 확인해보시면 H2 Database Engine이 실행된 것도 확인할 수 있습니다. 이제 브라우저의 H2 콘솔에서 Generic H2 (Embedded) 를 선택하시고 강의 내용대로 아래 이미지처럼 작성해주세요.연결 시험(Test Connection)을 눌러보면 아래 이미지처럼 db가 없다고 나올 것입니다. 그렇지만 걱정 마시고 이 상태에서 연결을 눌러보세요.db가 생성된 화면을 만날 수 있습니다.이제 db가 생성이 된 것입니다.그렇기 때문에 뒤로 가기를 눌러 다시 로그인 화면이 뜬 후에 연결 시험(Test Connection)을 눌러보면 아까와는 다르게 Test Successful이라는 성공 메세지를 만날 수 있습니다.(그러나 이것은 브라우저의 H2 콘솔 URL의 포트를 보시면 아시겠지만, 저희 프로젝트에서 db가 만들어진 것이 아닙니다. 이에 대해서는 아래를 읽어주세요) 제가 H2 경험이 별로 없어서 해당 방식이 Embedded, In memory, Server 모드 3가지 중 어떤 방식인지 잘 모르지만 서버 방식으로 추측됩니다.서버 방식은 H2를 따로 외부에서 띄워 놓고 접근해서 사용하는 것을 말하는 것 같은데요. 그렇기 때문에 저희가 만들어 놓은 프로젝트 URL인 localhost:{랜덤포트}/h2-console 에서 H2 사용 시 Embedded로 선택하여 Embedded 모드로 실행하면 연결 오류가 그대로 발생합니다. 그래서 강의와는 다르게 아래 이미지처럼 Server를 선택하여 외부(여기서는 프로젝트 외부에서 H2를 따로 동작시켜 db를 만들어준 것을 말함)의 H2에 접근하도록 연결해야 합니다.연결 방법은 아래와 같이 URL을 적어주면 됩니다. Saved Settings와 JDBC URL 입력 항목을 유의해주세요.이렇게 설정해준 후, Test Connection 버튼을 눌러보면 연결 테스트가 성공한 것을 확인할 수 있습니다.마찬가지로 연결 버튼을 클릭해보면 연결도 잘 됩니다. 이제 이 상태에서 강의를 이어서 진행하면 문제 없을 것입니다. ※ 추가적으로, 외부에서 서버를 켜놓고 접속하는 것이기 때문에 오른쪽 트레이의 H2 Database Engine을 우클릭하여 종료하면 프로젝트의 H2 콘솔에서 연결이 불가합니다. 그러니 프로젝트 작업 시에는 트레이를 종료하지 않도록 유의해주세요.※ 그리고, H2 Engine을 따로 받아서 서버 모드로 사용하면 DB 상태가 유지되지만, 이 방법은 프로젝트의 h2 jar 파일을 통해 진행하다보니 DB 상태가 유지되는지 알 수 없습니다. 오른쪽 트레이에서 H2를 재실행시키면 다시 DB를 만들어야 하는 것 같더라고요. 참고 부탁드려요~ [추가]Users Microservice - JPA①, ② 강의에서 H2 DB에 연결해 DB를 연결해주는데요.위의 과정은 Embedded가 아닌 Server 로 처리하기 때문에 설정이 다릅니다.application.yml 파일에서 아래와 같이 설정해주세요.유의하실 부분은 spring.datasource.url 부분과 spring.jpa.generate-ddl 부분입니다.url 만으로는 처리가 안되길래 jpa에서 db 생성하도록 generate-ddl을 true로 설정하였습니다.spring: application: name: user-service h2: console: enabled: true settings: web-allow-others: true path: /h2-console datasource: driver-class-name: org.h2.Driver url: jdbc:h2:tcp://localhost/mem:testdb username: sa jpa: generate-ddl: true
-
[리뉴얼] 코딩자율학습 제로초의 자바스크립트 입문
textContent error 이유를 모르겠습니다
삭제된 글입니다