diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c8b3146 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# hugo +public diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f2a7e2c --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/minimo"] + path = themes/minimo + url = https://github.com/MunifTanjim/minimo diff --git a/.hugo_build.lock b/.hugo_build.lock new file mode 100644 index 0000000..e69de29 diff --git a/CNAME b/CNAME deleted file mode 100644 index a9c986b..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -springrunner.dev \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..dd631d5 --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +HUGO = hugo +COMMIT_MESSAGE = "rebuilding site $(shell date +%Y-%m-%d)" + + +run: + $(HUGO) server -D + +clone: + rm -rf public + git clone git@github.com:springrunner/springrunner.github.io.git + mv springrunner.github.io public + +new: + $(HUGO) new post/$(shell date +%Y-%m-%d)-$(title).md + +deploy: + echo "\033[0;32mDeploying updates to GitHub...\033[0m" + + # Build the project. + $(HUGO) + + cd ./public && git add . && git commit -m $(COMMIT_MESSAGE) && git push \ No newline at end of file diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..00e77bd --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,6 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +--- + diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..f8911ae --- /dev/null +++ b/config.toml @@ -0,0 +1,157 @@ +baseURL = "https://springrunner.github.io" +title = "SpringRunner" +# for smart copyright line, leave this blank and check [params.copyright] +copyright = "" + +theme = "minimo" + +disqusShortname = "" +googleAnalytics = "" + +Paginate = 5 +preserveTaxonomyNames = true + +enableRobotsTXT = true # generate robots.txt + +# Syntax Highlighting ( https://gohugo.io/content-management/syntax-highlighting/ ) +pygmentsCodefences = true + +enableEmoji = true + +# Missing translations will default to this content language +defaultContentLanguage = "en" + +[params.info] +description = "" +title404 = "페이지를 찾을 수 없습니다." + +[params.assets] +favicon = "favicon.ico" +customCSS = ["assets/css/custom.css"] +customJS = [] +gopher = "" # used in 404 template ( Generator: https://gopherize.me ) + +[params.copyright] +prefix = "" +holder = "SpringRunner" +startYear = "2018" +suffix = "" + +[params.settings] +# date & time format: https://golang.org/pkg/time/ +dateFormat = "2006-01-02" +listDateFormat = "2006-01-02" +archiveDateFormat = "Jan 02" +hideEntryNavigation = ["page"] # boolean / array of sections +hideEntryMeta = ["page"] # boolean / array of sections +showReadingTime = false +showLastmod = true +taxonomyCloudShuffle = true +accentColor = "#ffcd00" +hideMainMenu = false + +[params.sidebar] +enable = true + +[params.widgets] +header = ["breadcrumbs"] +homepage = ["recent_posts"] +sidebar = ["about","social_menu","taxonomy_cloud"] +footer = ["social_menu"] + +[params.opengraph.facebook] +admins = [] # array of Facebook IDs +appID = "" +pageID = "" + +[params.opengraph.twitter] +page = "" # Twitter page username + +[params.seo] +# Title Separator: - – — · • * ⋆ | ~ « » < > +titleSeparator = "|" + +[params.social] +codepen = "" +email = "springrunner.kr@gmail.com" +facebook = "springrunner.kr" +github = "springrunner" +gitlab = "" +instagram = "" +linkedin = "" +twitter = "spring__runner" +telegram = "" +google_scholar = "" +youtube = "" + +[params.comments] +enable = false + +# Isso: https://posativ.org/isso/ +[params.comments.isso] +enable = false +scriptSrc = "" # "https://isso.example.com/js/embed.min.js" +dataAttrs = "" # "data-isso='https://isso.example.com' data-isso-require-author='true'" + +[params.comments.staticman] +enable = false +apiEndpoint = "https://api.staticman.net/v2/entry" +maxDepth = 2 + +[params.comments.staticman.github] +username = "" +repository = "" +branch = "" + +# Utterances: https://utteranc.es +[params.comments.utterances] +enable = true +issueTerm = "pathname" # pathname / url / title + +[params.comments.utterances.github] +username = "springrunner" +repository = "springrunner-site" + +[params.search] +client = "" # algolia / fuse / lunr + +[params.search.algolia] +appId = "" +indexName = "" +searchApiKey = "" + +[taxonomies] +author = "authors" +category = "categories" +series = "series" +tag = "tags" + +[permalinks] +page = "/:slug/" + +[[menu.main]] +name = "about us" +url = "/" +weight = -10 + +[[menu.main]] +name = "training" +url = "/training/" +weight = 10 + +#[[menu.main]] +#name = "Repo" +#weight = -10 +#identifier = "repository" +#url = "https://github.com/springrunner" + +[markup] + defaultMarkdownHandler = "goldmark" + +[languages] +# edit this block for your own language +[languages.en] +languageName = "English" +weight = 1 +[languages.en.params] +lang = "en" diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..b0e47cc --- /dev/null +++ b/content/_index.md @@ -0,0 +1,59 @@ +--- +title: "About Us" +description: "스프링러너(SpringRunner)는 스프링 기반 애플리케이션을 개발하는데 필요한 지식과 경험을 쌓을 수 있도록 돕는 오프라인 트레이닝 팀입니다." +linkTitle: "HOME" +images: ["/android-chrome-512x512.png"] +--- + +## 스프링러너(SpringRunner)를 소개합니다. + +스프링러너는 스프링 기반 애플리케이션을 개발하는데 필요한 지식과 경험을 쌓을 수 있도록 돕는 오프라인 트레이닝 팀입니다. + +스프링 기반 애플리케이션을 개발하기 위해서는 생각보다 많은 학습과 노력이 필요합니다. 서적과 온라인 교육 등을 통해 스프링의 기술적인 측면을 학습할 수 있습니다. 하지만 이렇게 학습을 통해 쌓은 지식만으로 애플리케이션을 개발하려고 하면 막막함을 느끼게됩니다. 스프링이 제공하는 기능 사용법은 배웠지만, 스프링 기반 애플리케이션 개발 경험을 가지지 못했기 때문입니다. + +참가자가 [스프링 프레임워크(Spring Framework)](https://spring.io/projects/spring-framework), [스프링 부트(Spring Boot)](https://spring.io/projects/spring-boot) 등 스프링 생태계에서 스프링 작동원리와 사용법을 배우고 거기서 더 나아가 실무에 적용 가능한 **스프링 기반 애플리케이션 프로그래밍**을 익힐 수 있도록 스프링러너가 도와드립니다. + +스프링러너 트레이닝 과정은 가이드 러너(Guide Runner)가 참가자들의 곁에서 과정을 함께 수행하도록 설계되었습니다. + +> 가이드 러너(Guide Runner)란, 스포츠 경기에서 선수들이 안전하게 경기를 펼칠 수 있도록 함께 뛰는 도우미를 뜻합니다. +> +> 우리는 트레이너로서 단순히 스프링 관련 지식을 전달하는 것을 넘어 참가자 곁에서 함께 달리며 개발자의 길을 함께 달리는 가이드 러너입니다. + +**스프링러너(SpringRunner)** 는 `스프링(Spring) + 가이드 러너(Guide Runner)`를 합해 만들어진 이름입니다. + +## 트레이닝 과정 + +[트레이닝(TRAINING)]({{< ref "/training" >}}) 페이지에서 준비 중인 과정을 볼 수 있습니다. + +## 팀 구성 + +### [박용권](https://arawn.github.io/) / arawn +* 19년차 엔터프라이즈 애플리케이션 개발 경력을 가진 시니어 소프트웨어 엔지니어 +* 기술 교육 활동 + - 네이버 기업교육: 스프링 웹 프로그래밍 워크숍 + - 카카오페이 신입 크루 온보딩 프로그램: Learn Java And Spring Programming Workshop + - SK플래닛 사내 스프링 웹 프로그래밍 강사 활동 +* 컨퍼런스/세미나 강연 활동 + - 2023·점핏 개취콘: [알아두면 쓸 데 있는 코틀린](https://speakerdeck.com/arawn/aladumyeon-sseul-de-issneun-koteulrin) + - 2023·인프런 퇴근길 밋업: [KOTLINCONF IS BACK : after the party](https://speakerdeck.com/arawn/kotlinconf-is-back-after-the-party) + - 2023·스프링캠프: [Journey to Modern Spring](https://speakerdeck.com/arawn/journey-to-modern-spring) + - 2022·Let'Swift: [우린 같은 같은 곳을 바라 보고 있나요?](https://speakerdeck.com/arawn/urin-gateun-gateun-goseul-bara-bogo-issnayo) + - 2022·인프콘: [코틀린 멀티플랫폼, 미지와의 조우](https://www.slideshare.net/arawnkr/ss-252699629) + - 2021·당근 SERVER 밋업: [#살아있다 #자프링외길12년차 #코프링2개월생존기](https://github.com/arawn/kotlin-support-in-spring) + - 2019·한국 스프링 사용자 모임 세미나: [잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다](https://www.slideshare.net/arawnkr/ss-195979955) + - 2018·기업 초대 강연: [점진적인 레거시 웹 애플리케이션 개선 과정](https://www.slideshare.net/arawnkr/ss-115339631) + - 2018·Spring Camp 컨퍼런스: [이벤트 기반 분산 시스템을 향한 여정](https://www.slideshare.net/arawnkr/ss-94475606) + - 2014·Adied 2014, 봄싹 세미나: [Resource Handling in Spring MVC](https://www.slideshare.net/arawnkr/resource-handling-in-spring-mvc) + - 2014·한국 자바 개발자 컨퍼런스(JCO Conference): [Overview of Spring 4.0](https://www.slideshare.net/arawnkr/overview-of-spring4) + - 2013·Spring Camp 컨퍼런스: Core Spring - [Java Configuration](https://www.slideshare.net/arawnkr/spring-camp-2013-java-configuration) + - 2013·한국 자바 개발자 컨퍼런스(JCO Conference): [Spring framework 3.2 > 4.0 — themes and trends](https://www.slideshare.net/arawnkr/spring-framework-32-40-themes-and-trends) + - 2012·전자정부 표준프레임워크 오픈커뮤니티 기술세미나: [빠르게 살펴보는 Spring MVC의 모든 것](http://olc.kr/course/course_online_view.jsp?id=254) + +### [김지헌](http://honeymon.io/about) / honeymon +* 14년차 엔터프라이즈 애플리케이션 개발 경력을 가진 시니어 소프트웨어 엔지니어 +* 지식 공유 및 기술 교류 목적으로 블로그 운영, 저서 출간, 다수의 세미나/교육 강연 활동 + - [블로그 - honeymon.io](http://honeymon.io) + - [허니몬의 자바guru](https://java.ihoney.pe.kr/) + - 저서 출간: [Boot Spring Boot! - 지앤선](http://www.yes24.com/24/Goods/62112463?Acode=101) + - 역서 출간: [Spring MVC 4 익히기 - 한빛미디어](http://www.hanbit.co.kr/store/books/look.php?p_code=E3493022562) + - SKPlanet T Academy: [토크ON 36차. 스프링 부트를 이용한 웹 서비스 개발](https://www.youtube.com/playlist?list=PL9mhQYIlKEhdjUeH15EBJvhdEgjMZa798) \ No newline at end of file diff --git a/content/guide/_index.md b/content/guide/_index.md new file mode 100644 index 0000000..22f8451 --- /dev/null +++ b/content/guide/_index.md @@ -0,0 +1,3 @@ +--- +linkTitle: "GUIDES" +--- diff --git a/content/training/_index.md b/content/training/_index.md new file mode 100644 index 0000000..127980b --- /dev/null +++ b/content/training/_index.md @@ -0,0 +1,16 @@ +--- +linkTitle: "TRAINING" +summary: "스프링러너(SpringRunner) 트레이닝 과정" +--- + +## 트레이닝 일정 + + + +아이캘린더(iCalendar)로 구독하시려면, 아래 주소를 사용해주세요. + +``` +https://calendar.google.com/calendar/ical/ssjc1milsi7mn97026kl3bnlic%40group.calendar.google.com/public/basic.ics +``` + +## 트레이닝 과정 \ No newline at end of file diff --git a/content/training/learn-essence-of-spring-workshop/hands-on-code.png b/content/training/learn-essence-of-spring-workshop/hands-on-code.png new file mode 100644 index 0000000..070771c Binary files /dev/null and b/content/training/learn-essence-of-spring-workshop/hands-on-code.png differ diff --git a/content/training/learn-essence-of-spring-workshop/index.md b/content/training/learn-essence-of-spring-workshop/index.md new file mode 100644 index 0000000..52ae6a6 --- /dev/null +++ b/content/training/learn-essence-of-spring-workshop/index.md @@ -0,0 +1,76 @@ +--- +title: "Learn Essence of Spring Workshop" +description: "스프링 프레임워크의 핵심 개발 원칙과 3대 기술(IoC/DI, AOP, PSA)을 학습하는 핸즈온 랩 워크숍입니다." +linkTitle: "Workshop" +date: 2019-12-17T09:00:00+09:00 +courseDate: 2020-05-23T10:00:00+09:00 +comments: false +isCJKLanguage: true +authors: ["arawn"] +images: ["/training/learn-essence-of-spring-workshop/hands-on-code.png"] +series: [] +categories: ["workshop"] +tags: ["spring core"] +--- + +본 워크숍은 스프링 프레임워크의 기본 기술이자 핵심 개발 원칙인 `제어의 역전(IoC)과 의존관계 주입(DI)`을 이해하고, 더 나아가 스프링 핵심 기술인 `관점지향 프로그래밍`, `이식 가능한 서비스 추상화`를 학습합니다. 참가자는 스프링 핵심 기술과 함께 소프트웨어 설계 원칙과 디자인 패턴을 배우고, 이를 응용해 **변경에 유연하게 대응할 수 있는 애플리케이션 개발**을 경험할 수 있습니다. + +### 목표 + +* 제어의 역전(IoC)과 의존관계 주입(DI)을 학습합니다. +* [스프링 IoC 컨테이너와 빈(Spring IoC Container and Beans)](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans)을 학습합니다. + - 스프링 IoC 컨테이너 생성과 소멸하는 방법을 다룹니다. + - 빈(Beans) 등록 및 관리 방법을 다룹니다. +* [관점지향 프로그래밍(Aspect Oriented Programming, AOP)](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop)을 학습합니다. + - 관점지향 프로그래밍의 원리를 학습합니다. + - 자바 코드로 직접 AOP를 다루는 방법을 학습합니다. + - 스프링이 제공하는 AOP 모듈을 다루는 방법을 학습합니다. +* [이식 가능한 서비스 추상화(Portable Service Abstraction)](https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#spring-integration)를 학습합니다. + - 서비스 추상화의 배경과 개념을 학습합니다. + - 스프링이 제공하는 PSA를 다루는 방법을 학습합니다. +* 소프트웨어 복잡성 이해하고, 복잡성을 다루는 몇 가지 설계 원칙과 디자인 패턴을 학습합니다. + +### 학습자료 및 환경 + +워크숍 과정에서 사용하는 JVM 플랫폼 및 프레임워크, 라이브러리와 도구는 아래와 같습니다. + +* Java SE 11 및 Java EE 8을 사용합니다. +* [Spring Framework 5.x](https://spring.io/projects/spring-framework)를 사용합니다. +* 빌드 도구로 [그레이들(Gradle)](https://gradle.org)을 사용합니다. +* [IDE](https://ko.wikipedia.org/wiki/통합_개발_환경)는 [Spring Tool Suite](https://spring.io/tools)를 사용합니다. + +### 진행방식 + +

+ +

+ +순수 자바로 작성된 [콘솔 애플리케이션](https://en.wikipedia.org/wiki/Console_application)에 스프링 프레임워크를 도입하고, 리팩토링을 통해 점진적으로 코드를 개선합니다. 가이드 러너가 라이브 코딩과 함께 리팩터링 목적과 스프링 기술을 설명해주면, 참가자는 해당 코드를 직접 작성하고 실행-테스트하는 과정을 반복하는 방식으로 진행됩니다. + +### 참가대상 및 준비물 + +* 본 워크숍은 자바(Java) 언어의 특징과 문법을 이해하고 사용할 줄 아는 분을 대상으로 합니다. +* 참가자는 Java SE 11과 Spring Tool Suite가 설치된 개인 노트북을 지참해야 합니다. + +### 참가신청 + +- 본 워크숍은 **유료**로 **사전 신청 및 결제** 후 참여할 수 있습니다. +- 신청 및 결제는 [페스타(Festa)](https://festa.io)를 통해 할 수 있습니다. + +### 참가취소 및 환불 정책 +- **마감전 취소/환불**은 페스타에서 할 수 있습니다. + - 참가 취소/환불 규정은 페스타 약관에 따라 처리됩니다. + - 참가비의 100%가 환불됩니다. +- **마감후 취소/환불**은 메일(help@springrunner.dev)로 신청해야합니다. + - 메일 내용에 은행 / 환불계좌 / 계좌주 / 연락처 / 페스타 아이디를 작성해 보내야합니다. + - 참가비의 50%가 환불됩니다. (교육장 계약 비용으로 인한 점 양해바랍니다) + +
+ +### 워크숍 일정 + +이 워크숍은 코로나바이러스감염증-19(COVID-19) 상황이 진정될 때까지 잠정 중단되었습니다. + + \ No newline at end of file diff --git a/content/training/mastering-spring-web-101-workshop/demo.png b/content/training/mastering-spring-web-101-workshop/demo.png new file mode 100644 index 0000000..03b42af Binary files /dev/null and b/content/training/mastering-spring-web-101-workshop/demo.png differ diff --git a/content/training/mastering-spring-web-101-workshop/index.md b/content/training/mastering-spring-web-101-workshop/index.md new file mode 100644 index 0000000..26cfbc4 --- /dev/null +++ b/content/training/mastering-spring-web-101-workshop/index.md @@ -0,0 +1,142 @@ +--- +title: "Mastering Spring Web 101 Workshop" +description: "스프링 기반 웹 애플리케이션 - 서버 사이드를 실습 중심으로 학습하는 워크샵입니다." +linkTitle: "Workshop" +date: 2018-12-01T09:00:00+09:00 +courseDate: 2019-11-24T10:00:00+09:00 +comments: false +isCJKLanguage: true +authors: ["arawn","honeymon"] +images: ["/training/mastering-spring-web-101-workshop/demo.png"] +series: [] +categories: ["workshop"] +tags: ["spring mvc", "spring boot"] +--- + +본 워크숍은 [Spring MVC](https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html)와 [Spring Boot](https://spring.io/projects/spring-boot)로 웹 애플리케이션 서버 사이드(Server-side)를 직접 개발하며 학습하는 워크숍입니다. 참가자는 Spring MVC의 핵심인 HTTP 요청 연결, 데이터 바인딩, 응답 및 예외 처리 방법을 배우고 경험 할 수 있습니다. + +* Spring MVC와 Spring Boot가 제공하는 다양한 웹 기능을 학습할 수 있습니다. +* 웹 애플리케이션에 서버 사이드 전체를 개발해보는 경험을 할 수 있습니다. + - 프론트엔드 엔지니어와 협업하며 프로젝트를 수행하는 것과 유사한 경험을 할 수 있습니다. + - 보편적인 웹 애플리케이션 아키텍처를 엿볼 수 있습니다. +* 라이브 코딩과 설명, 실습으로 18시간(온라인 3시간 / 오프라인 하루 7.5시간, 이틀간) 동안 진행됩니다. + +### 목표 + +* Spring MVC의 구조와 아키텍처를 살펴봅니다. + - Spring Boot가 제공하는 웹 기능도 함께 살펴봅니다. +* HTTP 요청을 연결하는 방법을 학습합니다. + - URL과 HTTP Method, Header 등 사용해 연결하는 방법을 다룹니다. + - 정적 자원(css, image, javascript)을 연결하는 방법을 다룹니다. +* HTTP 요청시 클라이언트(브라우저)가 전송한 데이터을 다루는 방법을 학습합니다. + - HTML 폼, JSON 페이로드, 파일 등 다양한 요청 데이터를 다룹니다. +* 요청 처리 결과를 클라이언트(브라우저)에게 응답하는 방법을 학습합니다. + - HTML 또는 JSON, 파일 컨텐트를 다룹니다. +* 요청 및 응답 처리 과정에서 발생한 예외를 처리하는 방법을 학습합니다. + - 오류 페이지와 메시지를 처리하는 방법을 다룹니다. +* 요청과 응답에 대해 전처리 또는 후처리 방법을 학습합니다. + - 사용자 인증과 인가 또는 로깅 등 처리 방법을 다룹니다. +* [i18n](https://en.wikipedia.org/wiki/Internationalization_and_localization)을 위한 메세지 다국어 처리 방법을 학습합니다. + +### 학습자료 및 환경 + +워크숍 과정에서 제공되는 학습 자료 중 일부를 [링크](https://github.com/springrunner/learn-spring-web-programming)를 통해 볼 수 있습니다. 그리고 사용하는 JVM 플랫폼 및 프레임워크, 라이브러리와 도구는 아래와 같습니다. + +* Java 21 및 Jakarta EE 10을 사용합니다. +* [Spring MVC 6.x](https://spring.io/projects/spring-framework), [Spring Boot 3.x](https://spring.io/projects/spring-boot)를 사용합니다. +* 빌드 도구로 [그레이들(Gradle)](https://gradle.org)을 사용합니다. +* [IDE](https://ko.wikipedia.org/wiki/통합_개발_환경)는 [IntelliJ IDEA Community Edition](https://www.jetbrains.com/idea/)을 사용합니다. + +### 진행방식 + +참가자는 제공되는 애플리케이션 정의서와 Web API 정의서, 그리고 [웹 클라이언트](https://github.com/springrunner/todoapp-client)로 할 일 목록 웹 애플리케이션(todos)에 서버 사이드를 개발합니다. + +

+ +

+ +가이드 러너가 라이브 코딩과 함께 Spring MVC(또는 Spring Boot)에 기능을 설명해주면, 참가자는 해당 코드를 직접 작성하고 실행-테스트 하는 과정을 반복하며 완전한 웹 애플리케이션을 개발해보는 방식으로 진행됩니다. + +### 참가대상 및 준비물 + +본 워크숍은 자바(Java)와 웹(Web)에 대한 이해가 있는 분을 대상으로 합니다. + +* 자바(Java)에 언어 특징과 문법을 이해하고 사용할 줄 알아야 합니다. + - 서블릿(Servlet)에 대해 이해도가 있으면, 워크숍 과정에서 좀 더 많은 것을 얻을 수 있습니다. +* [HTTP](https://www3.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html)에 대한 기본 지식과 이해가 필요합니다. + - 요청(Request)과 응답(Response)이라는 웹 처리 흐름에 대한 이해가 있어야 합니다. + - HTTP 헤더, 쿠키, 세션, 상태코드 등에 대한 이해가 있어야 합니다. + - [미디어타입(Media Type)](https://en.wikipedia.org/wiki/Media_type)에 대해 이해도가 있으면, 워크숍 과정에서 좀 더 많은 것을 얻을 수 있습니다. +* 웹 기술(HTML, CSS, JavaScript)에 대해 이해도가 있으면, 워크숍 과정에서 좀 더 많은 것을 얻을 수 있습니다. + +참가자는 Java 21과 IntelliJ IDEA Community Edition이 설치된 개인 노트북을 지참해야 합니다. + +### 참가신청 + +- 본 워크숍은 **유료**로 **사전 신청 및 결제** 후 참여할 수 있습니다. +- 신청 및 결제는 [페스타(Festa)](https://festa.io)를 통해 할 수 있습니다. + +### 참가취소 및 환불 정책 +- **마감전 취소/환불**은 페스타에서 할 수 있습니다. + - 참가 취소/환불 규정은 페스타 약관에 따라 처리됩니다. + - 참가비의 100%가 환불됩니다. +- **마감후 취소/환불**은 메일(help@springrunner.dev)로 신청해야합니다. + - 메일 내용에 은행 / 환불계좌 / 계좌주 / 연락처 / 페스타 아이디를 작성해 보내야합니다. + - 참가비의 50%가 환불됩니다. (교육장 계약 비용으로 인한 점 양해바랍니다) + +
+ +###### 워크숍 일정 및 이력 + +###### Mastering Spring Web 101 Workshop (10th) +- 일정: 2024년 8월 9일 ~ 8월 11일 +- 장소: 서울 강남구 봉은사로 303 502호, eBrain + +###### ~~Done: Mastering Spring Web 101 Workshop (9th)~~ +- 일정: 2020년 8월 14일 ~ 8월 16일 +- 장소: 서울시 강남구 논현로105길 10 2층, 펀에듀스페이스 +- 인원: 6명 + +###### ~~Done: Mastering Spring Web 101 Workshop (8th)~~ +- 일정: 2020년 7월 17일 ~ 7월 19일 +- 장소: 서울시 강남구 논현로105길 10 2층, 펀에듀스페이스 +- 인원: 5명 + +###### ~~Done: Mastering Spring Web 101 Workshop (7th)~~ +- 일정: 2020년 2월 15일 ~ 2월 16일 +- 장소: 서울시 서초구 서운로 142-4 재전빌딩, 코지 모임공간 강남2호점 +- 인원: 9명 + +###### ~~Done: Mastering Spring Web 101 Workshop (6th)~~ +- 일정: 2019년 11월 23일 ~ 11월 24일 +- 장소: 서울시 강남구 논현로105길 10 2층, 펀에듀스페이스 +- 인원: 8명 + +###### ~~Done: Mastering Spring Web 101 Workshop (5th)~~ +- 일정: 2019년 10월 19일 ~ 10월 26일 +- 장소: 서울시 강남구 논현로105길 10 2층, 펀에듀스페이스 +- 인원: 5명 + +###### ~~Done: Mastering Spring Web 101 Workshop (4th)~~ +- 일정: 2019년 9월 7일 ~ 9월 8일 +- 장소: 서울시 강남구 테헤란로4길 6, 마이워크스페이스 1호점 컨퍼런스룸 +- 인원: 11명 + +###### ~~Done: Mastering Spring Web 101 Workshop (3rd)~~ +- 일정: 2019년 8월 24일 ~ 8월 25일 +- 장소: 서울시 강남구 논현로105길 10 2층, 펀에듀스페이스 +- 인원: 13명 + +###### ~~Done: Mastering Spring Web 101 Workshop (2nd)~~ +- 일정: 2019년 7월 20일 ~ 2019년 7월 21일 +- 장소: 서울시 강남구 논현로105길 10 2층, 펀에듀스페이스 +- 인원: 11명 + +###### ~~Done: Mastering Spring Web 101 Workshop (1st)~~ +- 일정: 2019년 2월 16일 ~ 2019년 2월 17일 +- 장소: 서울시 강남구 강남대로62길 23 4층, 코드스쿼드 +- 인원: 10명 + + \ No newline at end of file diff --git a/data/authors/arawn.toml b/data/authors/arawn.toml new file mode 100644 index 0000000..3e147f3 --- /dev/null +++ b/data/authors/arawn.toml @@ -0,0 +1,8 @@ +id = "arawn" + +[email] +username = "arawn.kr" +host = "gmail.com" + +[name] +display = "박용권" diff --git a/data/authors/honeymon.toml b/data/authors/honeymon.toml new file mode 100644 index 0000000..2add23e --- /dev/null +++ b/data/authors/honeymon.toml @@ -0,0 +1,8 @@ +id = "honeymon" + +[email] +username = "ihoneymon" +host = "gmail.com" + +[name] +display = "김지헌" \ No newline at end of file diff --git a/data/config/widgets.toml b/data/config/widgets.toml new file mode 100644 index 0000000..fff3b7f --- /dev/null +++ b/data/config/widgets.toml @@ -0,0 +1,10 @@ +# About Widget config +[about] +title = " " # default: .Site.Title +description = "Spring Training Team" # default: .Site.Params.info.description +logo = "/assets/images/logo.png" # default: "/images/logo.png" + +# Breadcrumbs Widget config +[breadcrumbs] +separator = "/" # default: "/" +excludeParents = ["HOME","page"] # default: ["page"] \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index 654ede8..0000000 --- a/index.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - SpringRunner - 스프링 기반 애플리케이션 개발 트레이닝 - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- -
-

- 스프링러너는 스프링 기반 애플리케이션을 개발하는데 필요한 지식과 경험을 쌓을 수 있도록 돕는 트레이닝 팀입니다. -

-

- 스프링 기반 애플리케이션을 개발하기 위해서는 생각보다 많은 학습과 노력이 필요합니다. 서적과 온라인 교육 등을 통해 스프링의 기술적인 측면을 학습할 수 있습니다. - 하지만 이렇게 학습을 통해 쌓은 지식만으로 애플리케이션을 개발하려고 하면 막막함을 느끼게됩니다. 스프링이 제공하는 기능 사용법은 배웠지만, 스프링 기반 애플리케이션 개발 경험을 가지지 못했기 때문입니다. -

-

- 참가자가 스프링 프레임워크(Spring Framework), 스프링 부트(Spring Boot) 등 스프링 생태계에서 스프링 작동원리와 사용법을 배우고 거기서 더 나아가 실무에 적용 가능한 - 스프링 기반 애플리케이션 프로그래밍을 익힐 수 있도록 스프링러너가 도와드립니다. -

-
-

- 가이드 러너(Guide Runner)란, 스포츠 경기에서 선수들이 안전하게 경기를 끝낼 수 있도록 함께 뛰는 도우미를 뜻합니다. -

-
-

- 스프링러너는 트레이너로서 탄탄히 스프링 관련 지식을 전달하는 것을 넘어 참가자 곁에서 함께 달리며 개발자의 길을 함께 달리는 가이드 러너입니다. -

-
-

- 스프링러너(SpringRunner)는 스프링(Spring) + 가이드 러너(Guide Runner)를 합해 만들어진 이름입니다. -

-
- - -
-

훈련 프로그램

- -
-

- 스프링 핵심 프로그래밍(Learn Essence of Spring Workshop) - (개정 중) -

-

May 2020

-
    -
  • 제어의 역전(IoC)과 의존관계 주입(DI), 스프링 컨테이너와 빈 관리의 핵심 개념을 학습합니다.
  • -
  • 관점지향 프로그래밍(AOP)의 원리와 스프링 AOP 모듈 활용 방법을 익힙니다.
  • -
  • 이식 가능한 서비스 추상화(PSA)를 통해 기술 독립적인 애플리케이션 설계 방법을 다룹니다.
  • -
  • 소프트웨어 복잡성을 이해하고, 설계 원칙과 디자인 패턴을 적용하여 변경에 유연한 코드를 작성합니다.
  • -
  • 순수 자바 애플리케이션에 스프링을 도입하고 점진적 리팩토링을 통해 코드를 개선하는 경험을 쌓습니다.
  • -
-

더 나은 내용으로 개정 작업 중입니다. 곧 다시 만나요!

-
- -
-

- - 스프링 웹 마스터하기(Mastering Spring Web 101 Workshop) - -

-

November 2019

-
    -
  • Spring MVC와 Spring Boot로 웹 애플리케이션 서버 사이드를 직접 개발하며 실무 경험을 쌓습니다.
  • -
  • HTTP 요청 연결, 데이터 바인딩, 응답 및 예외 처리 등 Spring MVC의 핵심 기능을 학습합니다.
  • -
  • 인증과 인가, 국제화, 파일 처리 등 엔터프라이즈 환경의 복잡한 요구 사항을 다룹니다.
  • -
  • 변화하는 요구 사항에 유연하게 대응할 수 있는 소프트웨어 설계 역량과 아키텍처 구조를 익힙니다.
  • -
-
-
- - -
-

강의 프로그램

- -
-

- - 확장성 있는 시스템 설계하기 - -

-

February 2025

-
    -
  • 소규모에서 대규모 서비스로 성장하기 위한 확장성 있는 시스템 설계의 기본 원리를 익힙니다.
  • -
  • 가용성, 성능, 확장성을 고려한 단계별 설계 전략과 실천 방안을 학습합니다.
  • -
  • 플랫폼, 서버, 클라이언트 엔지니어링의 역할과 협업 방식을 알아봅니다.
  • -
-
- -
-

- 모듈형 모놀리스란 무엇인가 - (개정 중) -

-

September 2024

-
    -
  • 단일 코드베이스를 유지하면서도 명확한 책임과 경계를 가진 자율적인 모듈로 시스템을 구성하는 방법을 익힙니다.
  • -
  • 모듈을 비즈니스 기능 단위로 수직 분할하고, 각 모듈 내부를 계층화하여 복잡성을 관리하는 전략을 학습합니다.
  • -
  • 모듈화를 통해 유지 보수성과 유연성을 확보하면서도 시스템 복잡성을 효과적으로 관리하는 실천법을 알아봅니다.
  • -
-

더 나은 내용으로 개정 작업 중입니다. 곧 다시 만나요!

-
- -
-

- - 코틀린 멀티플랫폼, 미지와의 조우 - -

-

September 2022

-
    -
  • Kotlin/JS 기반 리액트와 Kotlin/JVM 기반 스프링을 활용하여 단일 코드베이스로 풀스택 웹 애플리케이션을 개발합니다.
  • -
  • 클라이언트와 서버 간 공유 로직을 작성하고, 도메인 모델과 저장소 로직을 멀티플랫폼으로 구현합니다.
  • -
  • 할 일 관리 애플리케이션을 실습하며 클린 아키텍처 기반의 웹 애플리케이션 구조를 경험합니다.
  • -
  • 코틀린 멀티플랫폼의 실용성과 한계를 파악하고, 실무 적용 가능성을 탐구합니다.
  • -
-
-
- - - -
-
- - diff --git a/layouts/partials/data/description b/layouts/partials/data/description new file mode 100644 index 0000000..d4fae31 --- /dev/null +++ b/layouts/partials/data/description @@ -0,0 +1,11 @@ +{{- with .Description -}} + {{- . -}} +{{- else -}} + {{- with .Params.Summary -}} + {{- . -}} + {{- else -}} + {{- with .Site.Params.info.description -}} + {{- . -}} + {{- end -}} + {{- end -}} +{{- end -}} diff --git a/layouts/partials/data/title b/layouts/partials/data/title new file mode 100644 index 0000000..a1c909e --- /dev/null +++ b/layouts/partials/data/title @@ -0,0 +1,27 @@ +{{- $title := ( .Title ) -}} +{{- $siteTitle := ( .Site.Title ) -}} +{{- $sep := ( .Site.Params.seo.titleSeparator | default "•" ) -}} +{{- $title404 := ( .Site.Params.info.title404 | default $title ) -}} + +{{- if .IsHome -}} + {{ $siteTitle }} +{{- else if eq .Kind "404" -}} + {{ $title404 }} {{ $sep }} {{ $siteTitle }} +{{- else if eq .Kind "taxonomy" -}} + {{- ( ( i18n .Data.Singular 1 ) | default .Data.Singular ) -}} + {{- print ": " -}} + {{- if eq .Data.Singular "author" -}} + {{- partial "data/author/displayName" . -}} + {{- else -}} + {{- $title -}} + {{- end -}} + {{- print " " $sep " " $siteTitle -}} +{{- else if ( or .IsNode ( eq .Section "page" ) ) -}} + {{- if .LinkTitle -}} + {{ ( .LinkTitle ) }} {{ $sep }} {{ $siteTitle }} + {{- else -}} + {{ $title }} {{ $sep }} {{ $siteTitle }} + {{- end -}} +{{- else -}} + {{ $title }} {{ $sep }} {{ $siteTitle }} +{{- end -}} diff --git a/layouts/partials/entry/meta/posted-on.html b/layouts/partials/entry/meta/posted-on.html new file mode 100644 index 0000000..e8b5620 --- /dev/null +++ b/layouts/partials/entry/meta/posted-on.html @@ -0,0 +1,13 @@ +{{- $dateFormat := ( .Site.Params.settings.dateFormat | default "2006, Jan 02" ) -}} + + {{- partial "svg/icon" "calendar" -}} + {{ i18n "postedOn" }} + + diff --git a/layouts/partials/head/extra.html b/layouts/partials/head/extra.html new file mode 100644 index 0000000..01ef448 --- /dev/null +++ b/layouts/partials/head/extra.html @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/layouts/partials/header.html b/layouts/partials/header.html new file mode 100644 index 0000000..af6635a --- /dev/null +++ b/layouts/partials/header.html @@ -0,0 +1,34 @@ + + + +{{- partial "head/head" . -}} + + + +
+ + {{- partial "sidebar/sidebar" . -}} + +
+ + {{- partial "nav/menus/main" . -}} + + {{- $headerWidgets := .Site.Params.widgets.header -}} +
+
+ {{- partial "extras/widget_area" ( dict "Widgets" $headerWidgets "Scope" . ) -}} +
+
+ + + +
diff --git a/layouts/training/li.course.html b/layouts/training/li.course.html new file mode 100644 index 0000000..8a0b930 --- /dev/null +++ b/layouts/training/li.course.html @@ -0,0 +1,21 @@ +
  • +
    + {{- $dateFormat := ( .Site.Params.settings.listDateFormat | default "2006, Jan 02" ) -}} + + {{ i18n "postedOn" }} + + +
    +
    +

    + {{- .Title -}} +

    +
    +
  • diff --git a/layouts/training/list.html b/layouts/training/list.html new file mode 100644 index 0000000..1f9483d --- /dev/null +++ b/layouts/training/list.html @@ -0,0 +1,21 @@ +{{ partial "header" . }} + +{{ partial "header/header" . }} + +{{ if .Content }} +
    + {{ partial "entry/content" . }} +
    +{{ end }} + +
    +
      + {{ range .Paginator.Pages }} + {{ .Render "li.course" }} + {{ end }} +
    + + {{ partial "nav/pagination" . }} +
    + +{{ partial "footer" . }} diff --git a/layouts/training/single.html b/layouts/training/single.html new file mode 100644 index 0000000..b795ed9 --- /dev/null +++ b/layouts/training/single.html @@ -0,0 +1,13 @@ +{{ partial "header" . }} + +
    + {{ partial "entry/header" . }} + {{ partial "entry/cover" . }} + {{ partial "entry/toc" . }} + {{ partial "entry/content" . }} + {{ partial "entry/footer" . }} +
    +{{ partial "nav/entry_nav" . }} +{{ partial "entry/comments" . }} + +{{ partial "footer" . }} diff --git a/springrunner.webp b/springrunner.webp deleted file mode 100644 index 4a7d4ef..0000000 Binary files a/springrunner.webp and /dev/null differ diff --git a/static/CNAME b/static/CNAME new file mode 100644 index 0000000..1f26179 --- /dev/null +++ b/static/CNAME @@ -0,0 +1 @@ +springrunner.dev diff --git a/static/android-chrome-192x192.png b/static/android-chrome-192x192.png new file mode 100755 index 0000000..126f2e0 Binary files /dev/null and b/static/android-chrome-192x192.png differ diff --git a/static/android-chrome-512x512.png b/static/android-chrome-512x512.png new file mode 100755 index 0000000..7a52c04 Binary files /dev/null and b/static/android-chrome-512x512.png differ diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png new file mode 100755 index 0000000..aa5972a Binary files /dev/null and b/static/apple-touch-icon.png differ diff --git a/static/assets/css/custom.css b/static/assets/css/custom.css new file mode 100644 index 0000000..e535cfb --- /dev/null +++ b/static/assets/css/custom.css @@ -0,0 +1,86 @@ +.widget.sep-after:after { + margin-top: 1.76em; +} + +.widget-about .logo { + max-width: 100%; +} + +.widget-about .logo img { + border-radius: 5px; +} + +.btn-register { + padding: 10px 15px; + overflow: hidden; + border-width: 0; + outline: none; + border-radius: 2px; + box-shadow: 0 1px 4px rgba(0, 0, 0, .6); + background-color: #26a69a; + color: #ecf0f1; + transition: background-color .3s; + border-bottom: none !important; +} + +.btn-register:hover, .btn-register:focus { + background-color: #35BAAC; +} + +.btn-register > * { + position: relative; +} + +.btn-register span { + display: block; + padding: 12px 24px; +} + +.btn-register:before { + content: ""; + position: absolute; + top: 50%; + left: 50%; + display: block; + width: 0; + padding-top: 0; + border-radius: 100%; + background-color: rgba(236, 240, 241, .3); + -webkit-transform: translate(-50%, -50%); + -moz-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -o-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.btn-register:active:before { + width: 120%; + padding-top: 120%; + transition: width .2s ease-out, padding-top .2s ease-out; +} + +.btn-register.orange { + background-color: #e67e22; +} + +.btn-register.orange:hover, .btn-register.orange:focus { + background-color: #d35400; +} + +.btn-register.gray { + color:rgb(160, 160, 160); + background-color:rgb(78, 78, 78); +} + +.btn-register.gray:hover, .btn-register.gray:focus { + color:rgb(160, 160, 160); + background-color: rgb(78, 78, 78); +} + +.btn-register.red { + background-color: #e74c3c; +} + +.btn-register.red:hover, .btn-register.red:focus { + background-color: #c0392b; +} \ No newline at end of file diff --git a/static/assets/images/logo.png b/static/assets/images/logo.png new file mode 100644 index 0000000..fc32061 Binary files /dev/null and b/static/assets/images/logo.png differ diff --git a/static/favicon-16x16.png b/static/favicon-16x16.png new file mode 100755 index 0000000..24346ba Binary files /dev/null and b/static/favicon-16x16.png differ diff --git a/static/favicon-32x32.png b/static/favicon-32x32.png new file mode 100755 index 0000000..6bfe2fa Binary files /dev/null and b/static/favicon-32x32.png differ diff --git a/favicon.ico b/static/favicon.ico old mode 100644 new mode 100755 similarity index 100% rename from favicon.ico rename to static/favicon.ico diff --git a/static/site.webmanifest b/static/site.webmanifest new file mode 100755 index 0000000..4e51a57 --- /dev/null +++ b/static/site.webmanifest @@ -0,0 +1 @@ +{"name":"SpringRunner","short_name":"SpringRunner","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/themes/minimo b/themes/minimo new file mode 160000 index 0000000..0e119b2 --- /dev/null +++ b/themes/minimo @@ -0,0 +1 @@ +Subproject commit 0e119b2343eaf2bdb60801a65d0d33d0236ef18c