This commit is contained in:
lunaticbum 2024-09-25 16:50:58 +09:00
parent 3c392310df
commit 25fcb01d23
21 changed files with 619 additions and 0 deletions

40
.gitignore vendored Normal file
View File

@ -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

5
Dockerfile Normal file
View File

@ -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"]

91
build.gradle.kts Normal file
View File

@ -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<org.gradle.jvm.tasks.Jar>() {
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<Test> {
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) }
})
}

1
settings.gradle.kts Normal file
View File

@ -0,0 +1 @@
rootProject.name = "lun"

View File

@ -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<String>) {
runApplication<LunApplication>(*args)
}
//
//@SpringBootApplication
//class Application {
// @Bean
// fun commandLineRunner(ctx: ApplicationContext): CommandLineRunner {
// return CommandLineRunner { args: Array<String?>? ->
// println("Let's inspect the beans provided by Spring Boot:")
// val beanNames: Array<String> = ctx.getBeanDefinitionNames()
// Arrays.sort(beanNames)
// for (beanName in beanNames) {
// println(beanName)
// }
// }
// }
//
// companion object {
// @JvmStatic
// fun main(args: Array<String>) {
// SpringApplication.run(Application::class.java, *args)
// }
// }
//}

View File

@ -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())
// }
}

View File

@ -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 {
}

View File

@ -0,0 +1,7 @@
package kr.lunaticbum.back.lun.configs
import org.springframework.context.annotation.Configuration
@Configuration
class RootAppContext {
}

View File

@ -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/")
}
}

View File

@ -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")
}
}

View File

@ -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)
}
}

View File

@ -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"
}
}

View File

@ -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"
}
}

View File

@ -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"
}
}

View File

@ -0,0 +1,3 @@
Manifest-Version: 1.0
Main-Class: kr.lunaticbum.back.lun.LunApplicationKt

View File

@ -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

View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>

View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Hello</h1>
</body>
</html>

View File

View File

@ -0,0 +1,141 @@
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Join</title>
<style>
table {
width: 280px;
height: 550px;
margin: auto;
}
.email {
width: 127px;
height: 32px;
font-size: 15px;
border: 0;
border-color: lightgray;
border-radius: 15px;
outline: none;
padding-left: 10px;
background-color: rgb(233,233,233);
}
.text {
width: 250px;
height: 32px;
font-size: 15px;
border: 0;
border-radius: 15px;
outline: none;
padding-left: 10px;
background-color: rgb(233,233,233);
}
select {
width: 100px;
height: 32px;
font-size: 15px;
border: 1px;
border-color: lightgray;
border-radius: 15px;
outline: none;
padding-left: 10px;
}
.btn {
width: 262px;
height: 32px;
font-size: 15px;
border: 0;
border-radius: 15px;
outline: none;
padding-left: 10px;
background-color: rgb(164, 199, 255);
}
.btn:active {
width: 262px;
height: 32px;
font-size: 15px;
border: 0;
border-radius: 15px;
outline: none;
padding-left: 10px;
background-color: rgb(61, 135, 255);
}
</style>
<script>
function userJoin() {
var httpRequest;
var user_id = document.getElementById("user_id").value;
var user_pw = document.getElementById("user_pw").value;
var user_pw_check = document.getElementById("user_pw_check").value;
var user_email = document.getElementById("user_email").value;
var user_birth = document.getElementById("user_birth").value;
var user_name = document.getElementById("user_name").value;
/* 통신에 사용 될 XMLHttpRequest 객체 정의 */
httpRequest = new XMLHttpRequest();
/* httpRequest의 readyState가 변화했을때 함수 실행 */
httpRequest.onreadystatechange = () => {
/* readyState가 Done이고 응답 값이 200일 때, 받아온 response로 name과 age를 그려줌 */
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
var result = httpRequest.response;
document.getElementById("name").innerText = result.name;
document.getElementById("age").innerText = result.age;
} else {
alert('Request Error!');
}
}
};
/* Get 방식으로 name 파라미터와 함께 요청 */
httpRequest.open('POST', 'joinUser.api', true);
httpRequest.setRequestHeader("Content-Type", "application/json");
let data = {
'user_id': user_id,
'user_pw': user_pw,
'user_pw_check': user_pw_check,
'user_email': user_email,
'user_birth': user_birth,
'user_name': user_name
}
httpRequest.send(JSON.stringify(data));
}
</script>
</head>
<body>
<form >
<table>
<tr>
<td><h2>회원가입</h2></td>
</tr>
<tr><td>아이디</td></tr>
<tr><td><input id="user_id" type="text" class="text"></td></tr>
<tr><td>비밀번호</td></tr>
<tr><td><input id="user_pw" type="password" class="text"></td></tr>
<tr><td>비밀번호 확인</td></tr>
<tr><td><input id="user_pw_check" type="password" class="text"></td></tr>
<tr><td>이름</td></tr>
<tr><td><input id="user_name" type="text" class="text"></td></tr>
<tr><td>생년월일</td></tr>
<tr><td><input id="user_birth" type="date" class="text"></td></tr>
<tr><td>이메일</td></tr>
<tr>
<td><input id="user_email" type="text" class="email"> @
<select>
<option>naver.com</option>
<option>gmail.com</option>
<option>daum.net</option>
<option>nate.com</option>
</select>
</td>
</tr>
<tr><td><input type="submit" value="가입하기" class="btn" onclick="userJoin()"></td></tr>
</table>
</form>
</body>
</html>

View File

@ -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() {
}
}