이야기를 나눠요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요 해당 강의를 보고 토이프로젝트를 진행하다 궁금한 점이 생겨 질문드립니다.
안녕하세요 항상 강의 잘 보고 있습니다.다름이 아니라 영한님의 jpa강의를 토대로 제가 하는 토이프로젝트에 적용하는 과정에서 궁금한 점 몇가지가 생겨서 질문드립니다.application.yaml파일에서 ddl-auto: create-drop으로 했을때 콘솔창에서는 해당 테이블이 없다면서 자꾸 오류가 났었습니다(콘솔에서는 오류가 나오나 DB상으로는 적절하게 테이블이 생성되었음). 그러나 먼저 ddl-auto: create로 해당 테이블들은 생성해놓고 그 다음 update를 하니 오류없이 동작했습니다. 강의를 들을때는 그러지 않았던것 같았는데 원래 이런건가요? 영한님께서 강의 도중 다대다 관계는 1대다, 다대1 관계로 풀어서 진행하라고 하셨던 기억이 납니다. 그렇게 하는 이유에 대해서는 이해를 하였습니다. 저는 기존의 관계형 데이터 베이스에서는 기존의 다대다 관계를 이루고 있던 테이블들의 pk를 가져와서 새로운 테이블에 FK로 넣었고 이러한 두개의 FK를 묶어서 하나의 PK로 만들었습니다. 그러나 강의에서는 기존의 테이블들을 이어주는 테이블에 FK로 넣어주기는 하였으나 아예 새로운 PK를 만들어서 강의를 진행하시던 기억이 납니다. 여기서 제가 궁금한 점은 기존에 제가 했던 방식대로 하려면 @Embedable으로 복합키를 만들어서 진행을 해야할까요? 아니면 기존 하던 방식 말고 새로운 PK를 만들어서 진행하는 방식이 훨씬 깔끔할까요? 제가 진행하는 토이프로젝트의 환경은 aws ec2를 사용하고 있으면 DB는 mariadb를 사용하고 있습니다. 자바 버전은 17입니다.
-
[중급편] 코인 가격 모니터링 앱 제작 (Android Kotlin)
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time. 가 뜹니다.
안녕하세요! 강의 잘 듣고 있는 수강생입니다.앱 클론코딩이 완료되어 실행해 보았습니다.다른 부분은 잘 되었는데 메인 화면에서 관심있는 코인을 새롭게 추가하려고 버튼을 누르자마자 앱이 죽더니 다음과 같은 오류가 발생했습니다. 이는 처음 대하는 오류여서 도움이 필요합니다. 감사합니다!
-
[중급편] 코인 가격 모니터링 앱 제작 (Android Kotlin)
E/RecyclerView: No adapter attached; skipping layout 이라는 오류가 뜹니다.
E/RecyclerView: No adapter attached; skipping layout 라는 오류가 뜹니다.코드도 다 맞는 것 같고, 레이아웃 파일에 app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" 와 같은 코드도 적어 두었는데 어디에서 오류가 나는지 모르겠어서 질문 드립니다. 아래는 스크린샷입니다. 감사합니다!!
-
나도코딩의 자바 기본편 - 풀코스 (20시간)
소스 코드 저작권 관련
안녕하세요 나도코딩 님수준 높은 강의해주셔서 감사합니다.덕분에 자바 언어를 복습하는데 큰 도움이 되었던 것 같습니다.혹시 강의를 보며 직접 타이핑해 본 코드를 github에 업로드 해도 될까요?(된다면 별도의 표기가 필요할까요?, 안 된다면 공개 범위를 private로 설정해서 업로드해도 되는지?)저작권 때문에 여쭤봅니다.
-
야곰의 iOS 프로그래밍
야곰님 xcode 버전
야곰님 이 강좌 찍었을 시점 xcode 버전 알 수 있을까요?
-
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
spring-boot 2.7 이상을 사용 하시는 분의 경우
안녕하세요. 강사님께서는 2.6 버전을 사용 권장 하셨지만 왠지 모를 궁금함에 2.7에서 사용하는 spring security 5.7 이상에서 바뀐 부분으로 한번 적용을 해보고 싶었습니다.인프런에 올라온 많은 분들의 질문을 정리 하여 만들어 보았습니다. package com.example.userservice.security; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import com.example.userservice.service.UserService; import lombok.RequiredArgsConstructor; @Configuration @EnableWebSecurity @RequiredArgsConstructor public class WebSecurity { private final UserService userService; private final BCryptPasswordEncoder bCryptPasswordEncoder; private final Environment env; AuthenticationManager authenticationManager; // spring.boot 2.7 부터는 WebSecurityConfigurerAdapter가 아닌 // SecurityFilterChain 을 사용 합니다. @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); authenticationManagerBuilder.userDetailsService(userService).passwordEncoder(bCryptPasswordEncoder); authenticationManager = authenticationManagerBuilder.build(); //AuthenticationFilter authenticationFilter = new AuthenticationFilter(); //authenticationFilter.setAuthenticationManager(authenticationManager); AuthenticationFilter authenticationFilter = new AuthenticationFilter(authenticationManager , userService , env); http.csrf().disable(); http.authorizeRequests() //.antMatchers("/error/**").permitAll() // public abstract java.lang.String javax.servlet.ServletRequest.getRemoteAddr() is not supported 보기 싫을때 활성화 .antMatchers("/**") .hasIpAddress("127.0.0.1") .and() .authenticationManager(authenticationManager) .addFilter(authenticationFilter) ; http.headers().frameOptions().disable(); return http.build(); } //ex) 기존의 경우 AuthenticationManagerBuilder 를 오버라이드 하여 사용 하였지만 filterChain 안에서 호출 하여 설정 합니다. /* protected void configure(AuthenticationManagerBuilder auth) throws Exception{ auth.userDetailsService(userService).passwordEncoder(bCryptPasswordEncoder); } */ //ex)filter를 authenticationAmanger에 주입 하던 getAuthenticationFilter역시 filterChain 내부에서 사용 합니다. /* private AuthenticationFilter getAuthenticationFilter() throws Exception { AuthenticationFilter authenticationFilter = new AuthenticationFilter(); authenticationFilter.setAuthenticationManager(authenticationManager); return authenticationFilter; } */ }
-
그림으로 쉽게 배우는 운영체제
이거는 그냥 공부하면서 궁금했던 내용입니다.
제가 운영체제 공부를 하면서 궁금한 내용입니다..어떤 교수님 강의를 보니까 working set을 구성하는 페이지가 [t-델타, t]여서 최근에 참조된 것을 찾으려면 t-델타부터 t까지 델타+1개를 살펴보고 set을 구성하는 방식이더라구요.근데 다른 책이나 서적을 찾아보면 델타개만큼을 보고 set을 판단하더라구요.t-델타 부터 t까지의 범위에서 참조된 페이지를 set으로 한다고 하는데,다른 사람들이랑 얘기해보니까 t이전에 참조된 델타개의 페이지를 set으로 한다고 그래서요..멘붕왔어요..그러니까 델타값이 4라고 가정하고, t(현재 시간)를 5라고 했을 때, 아래 중에 어떤 것이 맞는 방법 인가요?1) 현재 시간 포함하지 않고 최근 참조한 델타개의 참조열을 본다. ( 1234를 보고 working set 결정 )2) 현재 시간을 포함하여 최근 참조한 델타개의 참조열을 본다. ( 2345를 보고 working set 결정 )3) 현재 시간을 포함하여 최근 참조한 델타 +1개의 참조열을 본다. ( 12345를 보고 working set 결정 )
-
10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요 큰돌님
안녕하세요 큰돌님 큰맘먹고 알고리즘 코테강의와 CS전공지식 강의 질렀습니다. 중소기업 직장인인데 더 깊이있는 공부와 기회가 되면 더 좋은환경에 일하고 싶어서 믿고 공부해보려고 합니다 강의수강이 무제한이여서 감사하네요 주말에 틈틈히 공부하겠습니다. 이직은 언제가 될지 모르겠지만 좋은 후기로 돌아오겠습니다 화이팅!
-
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
junit5에서는 @Test 에노테이션에서 expected를 지원하지 않는 것 같습니다.
Assertions.assertThrows(IllegalStateException.class, () -> { memberService.join(m2); // Exception 터져야 돼. }); 혹시 junit5 쓰시는 분들은 위와 같이 수정하여서 돌려도 괜찮은 것 같습니다.
-
그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
자료구조와 알고리즘 관련 책 추천해주실 수 있을까요?
안녕하세요. 선생님기본편을 완강했고, 계속 복습할 예정입니다!심화편도 이제 수강할 예정입니다. 책도 한 권 구매해서 같이 공부하고 싶은데, 추천해주실 수 있을까요?감사합니다.
-
@시코 - Java 제대로 배우기 (완전 기초)
저작권?? 문의 드립니다
안녕하세요.강의 내용들을 정리 및 복습차원에서 간략하게나마 Tistory에 올리고있습니다.현재는 카테고리 전체를 비공개로 해 둔 상태이기도하고 공개로 돌릴 생각도 없습니다.다만 종종 구직중일때 다른 개발소스나 학습데이터들을 토대로 깃허브와 함께 포토폴리오로 사용하게 될때 단기간 공개로 바꾸어야할 경우가 있습니다.그 기간중 강의자료로 작성하신 소스코드나 학습 내용들이 단기간동안 공개되어도 괜찮으신지 여쭙고 싶습니다.출처는강의제목 / 강의자명 으로 간략하게 표기해둔 상태입니다상세하고 좋은강의 감사합니다..!
-
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Spring Boot 3.0.2를 사용 중이신 분들이 설정하면 좋은 것
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를 등록하는 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 데이터를 가져오는 법을 배워보고 싶은데 향후 강의에 추가될 계획이 있으신지요? :))