diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5a979af --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Kotlin ### +.kotlin diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..74c125e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:17 +ARG JAR_FILE=build/libs/lun-0.0.1-SNAPSHOT.jar +COPY ${JAR_FILE} app.jar +EXPOSE 8080 +ENTRYPOINT ["java","-jar","app.jar"] \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..b1e5524 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,91 @@ +plugins { + kotlin("jvm") version "1.9.25" + kotlin("plugin.spring") version "1.9.25" + id("org.springframework.boot") version "3.3.4" + id("io.spring.dependency-management") version "1.1.6" +} + +group = "kr.lunaticbum.back" +version = "0.0.1-SNAPSHOT" + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + +configurations { + compileOnly { + extendsFrom(configurations.annotationProcessor.get()) + } +} + +repositories { + mavenCentral() +} + +dependencies { +// implementation ("jakarta.servlet:jakarta.servlet-api") //스프링부트 3.0 이상 +// implementation ("jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api") //스프링부트 3.0 이상 +// implementation ("org.glassfish.web:jakarta.servlet.jsp.jstl") //스프링부트 3.0 이상 + implementation ("org.apache.tomcat.embed:tomcat-embed-jasper") + implementation("org.springframework.boot:spring-boot-starter-data-mongodb-reactive") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("io.projectreactor.kotlin:reactor-kotlin-extensions") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor") + compileOnly("org.projectlombok:lombok") + runtimeOnly("org.mariadb.jdbc:mariadb-java-client") + annotationProcessor("org.projectlombok:lombok") + testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("io.projectreactor:reactor-test") + testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} + +kotlin { + compilerOptions { + freeCompilerArgs.addAll("-Xjsr305=strict") + } +} +tasks.withType() { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + exclude("META-INF/BC1024KE.RSA", "META-INF/BC1024KE.SF", "META-INF/BC1024KE.DSA") + exclude("META-INF/BC2048KE.RSA", "META-INF/BC2048KE.SF", "META-INF/BC2048KE.DSA") +} +tasks.withType { + useJUnitPlatform() +} + + +tasks.jar { + manifest { + attributes["Main-Class"] = "kr.lunaticbum.back.lun.LunApplicationKt" + } + configurations["compileClasspath"].forEach { file: File -> + from(zipTree(file.absoluteFile)) + } + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +tasks.jar { + + // Otherwise you'll get a "No main manifest attribute" error + manifest { + attributes["Main-Class"] = "kr.lunaticbum.back.lun.LunApplicationKt" + } + + // To avoid the duplicate handling strategy error + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + // To add all of the dependencies otherwise a "NoClassDefFoundError" error + from(sourceSets.main.get().output) + + dependsOn(configurations.runtimeClasspath) + from({ + configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) } + }) +} + + diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..ee8cf41 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "lun" diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/LunApplication.kt b/src/main/kotlin/kr/lunaticbum/back/lun/LunApplication.kt new file mode 100644 index 0000000..3d7bbe4 --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/LunApplication.kt @@ -0,0 +1,39 @@ +package kr.lunaticbum.back.lun + +import org.springframework.boot.CommandLineRunner +import org.springframework.boot.SpringApplication +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication +import org.springframework.context.annotation.Bean +import java.util.* + + +@SpringBootApplication +class LunApplication + + +fun main(args: Array) { + runApplication(*args) +} +// +//@SpringBootApplication +//class Application { +// @Bean +// fun commandLineRunner(ctx: ApplicationContext): CommandLineRunner { +// return CommandLineRunner { args: Array? -> +// println("Let's inspect the beans provided by Spring Boot:") +// val beanNames: Array = ctx.getBeanDefinitionNames() +// Arrays.sort(beanNames) +// for (beanName in beanNames) { +// println(beanName) +// } +// } +// } +// +// companion object { +// @JvmStatic +// fun main(args: Array) { +// SpringApplication.run(Application::class.java, *args) +// } +// } +//} \ No newline at end of file diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/configs/AppConfig.kt b/src/main/kotlin/kr/lunaticbum/back/lun/configs/AppConfig.kt new file mode 100644 index 0000000..598da80 --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/configs/AppConfig.kt @@ -0,0 +1,31 @@ +package kr.lunaticbum.back.lun.configs + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.web.servlet.config.annotation.EnableWebMvc + + +@Configuration +@EnableWebMvc +class AppConfig { +// @Bean +// fun memberRepository(): MemberRepository { +// return MemoryMemberRepository() +// } +// +// @Bean +// fun discountPolicy(): DiscountPolicy { +// return RateDiscountPolicy() +// } +// +// @Bean +// fun memberService(): MemberService { +// return MemberServiceImpl(memberRepository()) +// } +// +// @Bean +// fun orderService(): OrderService { +// return OrderServiceImpl(memberRepository(), discountPolicy()) +// } + +} \ No newline at end of file diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/configs/AutoAppConfig.kt b/src/main/kotlin/kr/lunaticbum/back/lun/configs/AutoAppConfig.kt new file mode 100644 index 0000000..a141e8c --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/configs/AutoAppConfig.kt @@ -0,0 +1,14 @@ +package kr.lunaticbum.back.lun.configs + +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.FilterType +import org.springframework.web.servlet.config.annotation.EnableWebMvc + + +@Configuration +@EnableWebMvc +@ComponentScan(excludeFilters = [ComponentScan.Filter(type = FilterType.ANNOTATION, classes = arrayOf(Configuration::class))]) +class AutoAppConfig { + +} \ No newline at end of file diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/configs/RootAppContext.kt b/src/main/kotlin/kr/lunaticbum/back/lun/configs/RootAppContext.kt new file mode 100644 index 0000000..b567afe --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/configs/RootAppContext.kt @@ -0,0 +1,7 @@ +package kr.lunaticbum.back.lun.configs + +import org.springframework.context.annotation.Configuration + +@Configuration +class RootAppContext { +} \ No newline at end of file diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/configs/ServletAppContext.kt b/src/main/kotlin/kr/lunaticbum/back/lun/configs/ServletAppContext.kt new file mode 100644 index 0000000..98ecee8 --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/configs/ServletAppContext.kt @@ -0,0 +1,30 @@ +package kr.lunaticbum.back.lun.configs + +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.Configuration +import org.springframework.web.servlet.config.annotation.EnableWebMvc +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry +import org.springframework.web.servlet.config.annotation.ViewResolverRegistry +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer + + +// Spring MVC 프로젝트에 관련된 설정을 하는 클래스 +@Configuration // Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다. +@EnableWebMvc // 스캔할 패키지를 지정한다. +@ComponentScan("kr.lunaticbum.back.lun.controllers") +internal class ServletAppContext : WebMvcConfigurer { + // Controller의 메서드가 반환하는 jsp의 이름 앞뒤에 경로와 확장자를 붙혀주도록 설정한다. + override fun configureViewResolvers(registry: ViewResolverRegistry) { + // TODO Auto-generated method stub + super.configureViewResolvers(registry) +// registry.viewResolver { viewName, locale -> } +// registry.jsp("/WEB-INF/views/", ".jsp") + } + + // 정적 파일의 경로를 매핑한다. + override fun addResourceHandlers(registry: ResourceHandlerRegistry) { + // TODO Auto-generated method stub + super.addResourceHandlers(registry) + registry.addResourceHandler("/**").addResourceLocations("/resources/") + } +} \ No newline at end of file diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/configs/SpringConfigClass.kt b/src/main/kotlin/kr/lunaticbum/back/lun/configs/SpringConfigClass.kt new file mode 100644 index 0000000..41901b3 --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/configs/SpringConfigClass.kt @@ -0,0 +1,17 @@ +package kr.lunaticbum.back.lun.configs + +import jakarta.servlet.ServletContext +import org.springframework.web.WebApplicationInitializer +import org.springframework.web.filter.CharacterEncodingFilter + + +class SpringConfigClass : WebApplicationInitializer { + + override fun onStartup(servletContext: ServletContext) { + val filter = servletContext.addFilter("encodingFilter", CharacterEncodingFilter::class.java) + filter.setInitParameter("encoding", "UTF-8") + filter.addMappingForServletNames(null, false, "dispatcher") + } + + +} \ No newline at end of file diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/configs/WebConfig.kt b/src/main/kotlin/kr/lunaticbum/back/lun/configs/WebConfig.kt new file mode 100644 index 0000000..b366abf --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/configs/WebConfig.kt @@ -0,0 +1,33 @@ +package kr.lunaticbum.back.lun.configs + +import jakarta.servlet.ServletContext +import jakarta.servlet.ServletException +import org.springframework.web.WebApplicationInitializer +import org.springframework.web.context.ContextLoaderListener +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext +import org.springframework.web.servlet.DispatcherServlet + + +class WebConfig : WebApplicationInitializer { + @Throws(ServletException::class) + override fun onStartup(servletContext: ServletContext) { + // Spring MVC 프로젝트 설정을 위해 작성하는 클래스의 객체를 생성한다. + val servletAppContext = AnnotationConfigWebApplicationContext() + servletAppContext.register(ServletAppContext::class.java) + + // 요청 발생 시 요청을 처리하는 서블릿을 DispatcherServlet으로 설정해준다. + val dispatcherServlet = DispatcherServlet(servletAppContext) + val servlet = servletContext.addServlet("dispatcher", dispatcherServlet) + + // 부가 설정 + servlet.setLoadOnStartup(1) + servlet.addMapping("/") + + // Bean을 정의하는 클래스를 지정한다. + val rootAppContext = AnnotationConfigWebApplicationContext() + rootAppContext.register(RootAppContext::class.java) + + val listener = ContextLoaderListener(rootAppContext) + servletContext.addListener(listener) + } +} \ No newline at end of file diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Telegram.kt b/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Telegram.kt new file mode 100644 index 0000000..e42637a --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Telegram.kt @@ -0,0 +1,16 @@ +package kr.lunaticbum.back.lun.controllers + +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.ResponseBody +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("tlbt") +class Telegram { + @ResponseBody + @GetMapping("/hello") + fun hello(): String { + return "hello1212" + } +} \ No newline at end of file diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/controllers/User.kt b/src/main/kotlin/kr/lunaticbum/back/lun/controllers/User.kt new file mode 100644 index 0000000..560aa51 --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/controllers/User.kt @@ -0,0 +1,37 @@ +package kr.lunaticbum.back.lun.controllers + +import jakarta.servlet.http.HttpServletRequest +import org.springframework.web.bind.annotation.* +import org.springframework.web.servlet.ModelAndView +import org.springframework.web.servlet.view.ContentNegotiatingViewResolver + +@RestController +@RequestMapping("/user") +class User(private val viewResolver: ContentNegotiatingViewResolver) { + + @GetMapping("join") + fun hello(httpServletRequest: HttpServletRequest): ModelAndView { + println("onJoin") + val vm = ModelAndView("join") + vm.modelMap.put("ddd","asdas") + println("${vm.toString()}") + return vm + } + + + @ResponseBody + @PostMapping("joinUser.api") + fun joinUser(httpServletRequest: HttpServletRequest, @RequestBody jsonString: String) : String { + println("${httpServletRequest.requestURI}") + val reqString = jsonString + println(reqString) + return "1234" + } + + @ResponseBody + @GetMapping("test/{path}") + fun test(@PathVariable path : String): String { + println("path >>> $path") + return "ok" + } +} \ No newline at end of file diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/utils/Logger.kt b/src/main/kotlin/kr/lunaticbum/back/lun/utils/Logger.kt new file mode 100644 index 0000000..8dd0d80 --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/utils/Logger.kt @@ -0,0 +1,66 @@ +package kr.lunaticbum.back.lun.utils + +import jakarta.annotation.PostConstruct +import jakarta.annotation.PreDestroy +import jakarta.servlet.http.HttpServletRequest +import lombok.RequiredArgsConstructor +import org.springframework.context.annotation.Scope +import org.springframework.context.annotation.ScopedProxyMode +import org.springframework.stereotype.Component +import org.springframework.stereotype.Controller +import org.springframework.stereotype.Service +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.ResponseBody +import java.util.* + + +@Component +@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) +class Logger { + private var uuid: String? = null + private var requestURL: String? = null + fun setRequestURL(requestURL: String?) { + this.requestURL = requestURL + } + + fun log(message: String) { + println("[$uuid] [$requestURL] $message") + } + + @PostConstruct + fun init() { + uuid = UUID.randomUUID().toString() + println("[$uuid] request scope bean create:$this") + } + + @PreDestroy + fun close() { + println("[$uuid] request scope bean close:$this") + } +} + +@Service +@RequiredArgsConstructor +class LogService { + private val myLogger: Logger? = null + fun logic(id: String) { + myLogger?.log("service id = $id") + } +} + +@Controller +@RequiredArgsConstructor +class LogController { + private val logService: LogService? = null + private val myLogger: Logger? = null + + @RequestMapping("log-demo") + @ResponseBody + fun logDemo(request: HttpServletRequest): String { + val requestURL = request.requestURL.toString() + myLogger?.setRequestURL(requestURL) + myLogger?.log("controller test") + logService!!.logic("testId") + return "OK" + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 0000000..d35282c --- /dev/null +++ b/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: kr.lunaticbum.back.lun.LunApplicationKt + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..64b48f2 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,15 @@ +spring.application.name=lun +spring.datasource.url=jdbc:mariadb://lunaticbum.kr:3307/lun_db +#spring.datasource.url=jdbc:mariadb://localhost:3307/lun_db +spring.datasource.username=lun_admin +spring.datasource.password=VioPup*383 +spring.datasource.driver-class-name=org.mariadb.jdbc.Driver +spring.data.mongodb.host=nas.lunaticbum.kr +#spring.data.mongodb.host=localhost +spring.data.mongodb.port=27017 +spring.data.mongodb.database=lun_db +#spring.main.web-application-type=SERVLET +#logging.level.org.springframework.boot.autoconfigure=ERROR +#spring.mvc.view.prefix=/templates +#spring.mvc.view.suffix=.html +#server.servlet.register-default-servlet=true \ No newline at end of file diff --git a/src/main/resources/static/error.html b/src/main/resources/static/error.html new file mode 100644 index 0000000..566549b --- /dev/null +++ b/src/main/resources/static/error.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html new file mode 100644 index 0000000..bf0930f --- /dev/null +++ b/src/main/resources/static/index.html @@ -0,0 +1,10 @@ + + + + + Title + + +

Hello

+ + \ No newline at end of file diff --git a/src/main/resources/templates/first.html b/src/main/resources/templates/first.html new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/templates/join.html b/src/main/resources/templates/join.html new file mode 100644 index 0000000..afcfbf5 --- /dev/null +++ b/src/main/resources/templates/join.html @@ -0,0 +1,141 @@ +<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + + + + + + Join + + + + +
+ + + + + + + + + + + + + + + + + + + +

회원가입

아이디
비밀번호
비밀번호 확인
이름
생년월일
이메일
@ + +
+
+ + \ No newline at end of file diff --git a/src/test/kotlin/kr/lunaticbum/back/lun/LunApplicationTests.kt b/src/test/kotlin/kr/lunaticbum/back/lun/LunApplicationTests.kt new file mode 100644 index 0000000..8ea969d --- /dev/null +++ b/src/test/kotlin/kr/lunaticbum/back/lun/LunApplicationTests.kt @@ -0,0 +1,13 @@ +package kr.lunaticbum.back.lun + +import org.junit.jupiter.api.Test +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +class LunApplicationTests { + + @Test + fun contextLoads() { + } + +}