Spring ๊ณผ SpringBoot ์ ์ฐจ์ด
MVC ์ Security ๊ฐ์ Spring ๋ชจ๋ ์ ํต์ฌ Spring ์์ ์ฌ์ฉ ํ ๋ ์ Boot ์์ ์ฌ์ฉ ํ ๋์ ์ฐจ์ด ์ ์ ์ค์ ์ ๋ ๊ณ ํ ๋ก ํ ๊ฒ ์ ๋ ๋ค.
Spring ์ด ๋ญ ์์?
์ฝ๊ฒ ๋ง ํ๋ฉด Spring ํ๋ ์ ์ ํฌ ๋ ์๋ฐ ์ ํ ๋ฆฌ ์ผ ์ด ์ ๊ฐ๋ฐ ์ ์ ๋ฉด์ ์ธ ์ธ ์ธ ํ ๋ผ ์ง์ ์ ์ ๊ณต ํ๋ค.
๊ทธ๊ฒ ์ ์ฃผ์ ์ ์์กด ํ๊ณ ๊ธฐ ์กด์ ๋ชจ๋,์ ๋ฅผ ๋ค ์ด:
์ ๋ฅผ ๋ค ์ด ์๋ฐ ์น ๊ฐ๋ฐ ์ด๊ธฐ ์ ์ฐ ๋ฆฌ ๋ ๋๋์ ๋ชจ๋ธ ์ฝ๋ ๋ฅผ ์์ฑ ํ์ฌ ๊ธฐ๋ก ์ ๋ฐ์ดํฐ ์๋ณธ ์ ์ฝ์ ํด ์ผ ํ๋ค.springjdbc ๋ชจ๋ ์ JDBCtemplate ๋ฅผ ์ฌ์ฉ ํ๋ฉด ๋ช ์ค ์ฝ๋ ๋ก ๊ฐ๋ตํ ํ ์ ์ ์ต ๋ ๋ค.
Spring Boot ๊ฐ ๋ญ ์์?
Spring Boot ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Spring ํ๋ ์ ์ ํฌ ์ ํ์ฅ ์ผ๋ก Spring ํ๋ก๊ทธ๋จ ์ค์ ์ ํ์ ํ ๋ชจ๋ธ ์ค์ ์ ์ ๊ฑฐ ํฉ ๋ ๋ค.
์ด ๋ Spring ํ๋ซํผ ์ ๋ํด ์์ ์ ์๊ฒฌ ์ ๊ณ ์ง ํ ๋ฉฐ ๋์ฑ ๋น ๋ฅด ๊ณ ํจ์จ ์ ์ธ ์ํ ์์คํ ๊ฐ๋ฐ ์ ์ํด ๊ธธ ์ ๋ฆ ์ ๋ค.
๋ค์์ Spring Boot ์ ์ผ๋ถ ๊ธฐ๋ฅ ์ ๋ ๋ค.
Maven ์์กด ํญ
์ฐ์ ,Spring ์ ์ฌ์ฉ ํ์ฌ ์น ํ๋ก๊ทธ๋จ ์ ๋ง ๋ ๋ ๋ฐ ํ์ ํ ์ต์ ์์กด์ฑ ์ ์ด ํด ๋ณด ์.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.5</version>
</dependency>
Spring ๊ณผ ๋ฌ๋ฆฌ Spring Boot ๋ ์์กด ํญ๋ชฉ ํ๋๋ง ์ ์ผ ๋ฉด ์น ํ๋ก๊ทธ๋จ ์ ์์ ํ๊ณ ์คํ ํ ์ ์ ์ต ๋ ๋ค.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.4</version>
</dependency>
๊ตฌ์ถ ๊ธฐ๊ฐ ์ ๋ชจ๋ ์์กด ํญ๋ชฉ ์ด ์ต์ข
์์ถ ํ์ผ ์ ์๋ ์ผ๋ก ์ถ ๊ฐ ๋ฉ ๋ ๋ค.๋ ํ๋์ ์ข ์ ์ ๋ ํ ์คํธ ๋ผ ์ด๋ธ ๋ฌ ๋ฆฌ ๋ค.์ฐ ๋ฆฌ ๋ ๋ณดํต Spring-Test,JUnit,Hamcrest,Mockito ๋ผ ์ด๋ธ ๋ฌ ๋ฆฌ ๋ฅผ ์ฌ์ฉํ๋ค.Spring ํ๋ก์ ํธ ์ ์ ๋ ์์กด ํญ๋ชฉ ์ผ๋ก ๋ชจ๋ ๋ผ ์ด๋ธ ๋ฌ ๋ฆฌ ๋ฅผ ์ถ๊ฐ ํด ์ผ ํฉ ๋ ๋ค.
๋๋ springboot ์์ starter ์์กด ํญ๋ชฉ ๋ง ์ ์ผ ๋ฉด ์ด ๋ผ ์ด๋ธ ๋ฌ ๋ฆฌ ๋ฅผ ์๋ ์ผ๋ก ํฌํจ ํ ์ ์ ์ต ๋ ๋ค.
springboot ์ ์๋ก ๋ค๋ฅธ Spring ๋ชจ๋ ์ ๋ง์ ์์ ํ๋ก๊ทธ๋จ ์์กด ํญ๋ชฉ ์ ์ ๊ณต ํฉ ๋ ๋ค.๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ ํ ๋ ๋ฐฉ๋ฒ ์:
MVC ์ค์
Spring ๊ณผ SpringBoot ๋ฅผ ์ฌ์ฉ ํ์ฌ jsp ์น ํ๋ก๊ทธ๋จ ์ ๋ง ๋ ๋ ๋ฐ ํ์ ํ ์ค์ ์ ์ฐ๊ตฌ ํฉ ์๋ค.
Spring ์ dispatcherservlet,๋งต ๋ฐ ๊ธฐํ ์ง์ ์ค์ ์ ์ ์ ํด ์ผ ํฉ ๋ ๋ค.์น.xml ํ์ผ ์ด๋ ์ด๊ธฐ ๊ฐ ์ผ๋ก ํญ๋ชฉ ํด๋์ค ๋ฅผ ์ค์ ํ ์ ์ ์ต ๋ ๋ค.
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
AnnotationConfigWebApplicationContext context
= new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.baeldung");
container.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
@EnableWebMvc ์ฃผ์ ์@Configuration ํด๋์ค ์ ์ถ๊ฐ ํ๊ณ ์ปจํธ๋กค ๋ฌ ์์ ๋์ ์ค ๋ ๋ณด ๊ธฐ ๋ฅผ ํด์ ํ๊ธฐ ์ํด ๋ณด๊ธฐ ํด์ ๊ธฐ ๋ฅผ ์ ์ ํด ์ผ ํฉ ๋ ๋ค.
@EnableWebMvc
@Configuration
public class ClientWebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver bean
= new InternalResourceViewResolver();
bean.setViewClass(JstlView.class);
bean.setPrefix("/WEB-INF/view/");
bean.setSuffix(".jsp");
return bean;
}
}
์ด์ ๋นํด ์น starter ๋ฅผ ์ถ๊ฐ ํ ํ Spring Boot ๋ ๋ช ๊ฐ์ง ์์ฑ ๋ง ์ ์ผ ๋ฉด ์์
ํ ์ ์ ์ต ๋ ๋ค.
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
auto-configuration ์ด๋ผ๋ process ๋ฅผ ํต ํด bootwebstarter ๋ฅผ ์ถ๊ฐ ํ๋ฉด ์์ ๋ชจ๋ Spring ์ค์ ์ด ์๋ ์ผ๋ก ํฌ ํจ ๋ฉ ๋ ๋ค.์ด๊ฒ ์ springboot ๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ ์ ์กด์ฌ ํ ๋ ์์กด ํญ๋ชฉ,์์ฑ,bean ์ ๋ณด๊ณ ์ด ๋ฅผ ๋ฐํ ์ผ๋ก ์ค์ ์ ์ฌ์ฉ ํ ๋ค ๋ ๊ฒ ์ ์๋ฏธ ํฉ ๋ ๋ค.
๋ฌผ๋ก ์ฌ์ฉ์ ์ ์ ์ค์ ์ ์ถ๊ฐ ํ๋ ค ๋ฉด Spring-boot ์๋ ์ค์ ์ด ์ข ๋ฃ ๋ฉ ๋ ๋ค.
ํ ํ ๋ฆฟ ์์ง ์ค์
์ด์ ์คํ๋ง ๊ณผ springboot ์ Thymeleaf ํ ํ ๋ฆฟ ์์ง ์ ์ค์ ํ ๋ ๋ฐฉ๋ฒ ์ ๋ฐฐ ์ ๋ด ์๋ค.
Spring ์ ์ ๋ ๋ณด๊ธฐ ํด์๋ ๊ธฐ ์ thymeleaf-spring 5 ์์กด ํญ๋ชฉ ๊ณผ ์ค์ ์ ์ถ๊ฐ ํด ์ผ ํฉ ๋ ๋ค.
@Configuration
@EnableWebMvc
public class MvcWebConfig implements WebMvcConfigurer {
@Autowired
private ApplicationContext applicationContext;
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver =
new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(applicationContext);
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
registry.viewResolver(resolver);
}
}
SpringBoot ๋ springbootstarter thymeleaf ์ ์์กด์ฑ ๋ง ์ ์ผ ๋ฉด ์น ํ๋ก๊ทธ๋จ ์์ thymeleaf ์ง์ ์ ์ฌ์ฉ ํ ์ ์ ์ต ๋ ๋ค.Thymeleaf 3.0 ์ ์๋ก์ด ๊ธฐ๋ฅ ๋๋ฌธ์,์ฐ ๋ฆฌ ๋ springboot2web ์์ฉ ํ๋ก๊ทธ๋จ ์ thymeleaf-layout-dialect ๋ฅผ ์์กด ํญ๋ชฉ ์ผ๋ก ์ถ๊ฐ ํด ์ผ ํฉ ๋ ๋ค.๋๋,์ฐ ๋ฆฌ ๋ springbootstarter ์ eleaf ์์กด ๋ ๋ฅผ ์ถ๊ฐ ํ ์ ์ ์ต ๋ ๋ค.์ด๊ฒ ์ ์ฐ๋ฆฌ ์ ๊ฒ ๋ชจ๋ ๊ฒ ์ ์ฒ๋ฆฌ ํด ์ค ๊ฒ ์
๋ ๋ค.์์กด ํญ๋ชฉ ์ด ์๋ฆฌ ์ ์ ์ผ ๋ฉด src/main/resources/templates ํด ๋ ์ ํ ํ ๋ฆฟ ์ ์ถ๊ฐ ํ ์ ์ ์ต ๋ ๋ค.Spring ๊ฐ ์ด ๋ ๋ ์๋ ์ผ๋ก ํ ์ ๋ฉ ๋ ๋ค.
๋ด ๋ณด์ ์ค์
๊ฐ๋จํ๊ฒ ๋ณด๊ธฐ ์ํด ์ ์ด ํ๋ ์ ์ ํฌ ๋ฅผ ์ฌ์ฉ ํ์ฌ ๊ธฐ๋ณธ HTTP ๊ธฐ๋ณธ ์ธ์ฆ ์ ์ฌ์ฉ ํ ๋ ๋ฐฉ๋ฒ ์ ๋ณผ ์ ์ ์ต ๋ ๋ค.
Spring ์ ์ฌ์ฉ ํ์ฌ ๋ณด์ ์ ์ฌ์ฉ ํ ๋ ๋ฐ ํ์ ํ ์์กด ํญ๋ชฉ ๊ณผ ์ค์ ์ ์ด ํด ๋ณด ๊ฒ ์ต ๋ ๋ค.
Spring ์ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ ์ ์ค์ ํ๊ธฐ ์ํด ํ์ค springsecurity web ๊ณผ springsecurity config ์์กด ํญ๋ชฉ ์ด ํ์ ํฉ ๋ ๋ค.
๋ค์์ ์น ๋ณด์ ConfigureAdapter ๋ฅผ ํ์ฅ ํ๊ณ @EnableWebSecurity ์ฃผ์ ์ ์ฌ์ฉ ํ ํด๋์ค ๋ฅผ ์ถ๊ฐ ํด ์ผ ํฉ ๋ ๋ค.
@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user1")
.password(passwordEncoder()
.encode("user1Pass"))
.authorities("ROLE_USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
์ธ์ฆ ์ ์ค์ ํ๊ธฐ ์ํด inMemory Authentication ์ ์ฌ์ฉ ํฉ ๋ ๋ค.springboot ์ ์ด๋ฌํ ์์กด ํญ๋ชฉ ์ด ์์ด ์ผ ์์ ํ ์ ์ ์ต ๋ ๋ค.๊ทธ๋ฌ๋ spring-boot-starter-security ์ ์์กด ํญ๋ชฉ ๋ง ์ ์ ํด ์ผ ํฉ ๋ ๋ค.์ด ๋ ๋ชจ๋ ์์กด ํญ๋ชฉ ์ classpath ๋ฅ ๊ฒฝ๋ก ์ ์๋ ์ผ๋ก ์ถ๊ฐ ํ๊ธฐ ๋ ๋ฌธ ์ ๋ ๋ค.
springboot ์ security ๋ณด์ ์ค์ ์ ์ ์ ๊ฐ ์ต ๋ ๋ค.
Spring ๊ณผ Spring ์๋ด ์์ JPA ์ค์ ์ ์ด๋ป๊ฒ ์คํ ํ ๋ ์ง ์ ๊ณ ์ถ ์ผ ๋ฉด,์ฐ๋ฆฌ ์ ๊ธ A Guide To JPA with Spring:https://www.baeldung.com/the-persistence-layer-with-spring-and-jpa์ ๋ณผ ์ ์ ์ต ๋ ๋ค.
Application Bootstrap
Spring ๊ณผ Spring ๊ฐ์ด๋ ์์ ํ๋ก๊ทธ๋จ ์ ์ ๋ ํ ๋ ๊ธฐ๋ณธ ์ ์ธ ์ฐจ ์ด ๋ servlet ์ ์๋ค.Spring ์ ์น.xml ๋๋ SpringServletContainer Initializer ๋ฅผ ์๋ด ์ ๊ตฌ ๋ก ์ฌ์ฉ ํฉ ๋ ๋ค.
ํํธ,SpringBoot ๋ Servlet 3 ๊ธฐ๋ฅ ๋ง ์ฌ์ฉ ํ์ฌ ํ๋ก๊ทธ๋จ ์ ์ ๋ ํฉ ๋ ๋ค.์ฐ๋ฆฌ ์์ธํ ์ด์ผ๊ธฐ ํฉ ์๋ค.
Spring ์ ์ด๋ป๊ฒ ์ธ๋ ํฉ ๋๊น?
Spring ์ ์ ํต ์ ์ธ ์น.xml ์๋ด ๋ฐฉ์ ๊ณผ ์ต์ Servlet 3+๋ฐฉ๋ฒ ์ ์ง์ ํฉ ๋ ๋ค.
์น.xml ๋จ๊ณ๋ณ ์ ๊ทผ ์ ๋ณด ์ฌ ์ค ๋ ๋ค.
1.Servlet ์ฉ๊ธฐ(์๋ฒ)์น.xml ์ฝ ๊ธฐ.
2.Dispatcher Servlet ์ ์ ๋ ์น.xml ์์ ์ฉ๊ธฐ ๋ก ์ํ ํฉ ๋ ๋ค.
3.DispatcherServlet ๋ WEB-INF/{servletName}์ ์ฝ ์ด ์น ์์ฉ ํ๋ก๊ทธ๋จ Context-servlet.xml ์ ๋ง ๋ญ ๋ ๋ค.
4.๋ง์ง๋ง ์ผ๋ก Dispatcher Servlet ๋ ์์ฉ ํ๋ก๊ทธ๋จ ์ปจ ํ ์คํธ ์ ์ ์ ๋ bean ์ ๋ฑ๋ก ํฉ ๋ ๋ค.
๋ค์์ ์ด๋ป๊ฒ Servlet 3+๋ฐฉ๋ฒ ์ผ๋ก Spring ์ ๋ด ๋ฅผ ์งํ ํฉ ๋๊น?
1.์ฉ๊ธฐ ๊ฒ์ ์ ServletContainer Initializer ์ ํด๋์ค ๋ฅผ ์คํ ํฉ ๋ ๋ค.
2.SpringServletContainer Initializer ๋ ์น ์ ํ ๋ฆฌ ์ผ ์ด ์ Initializer ๋ฅผ ์คํ ํ ๋ ๋ชจ๋ ์ข ๋ฅ ๋ฅผ ์ฐพ ์ต ๋ ๋ค.
3.WebapplicationInitializer ๋ XML ๋๋@Configuration ๋ฅ ๋ฅผ ์ฌ์ฉ ํ์ฌ ์ปจ ํ ์คํธ ๋ฅผ ๋ง ๋ญ ๋ ๋ค.
4.WebapplicationInitializer ๋ ์ด์ ์ ๋ง ๋ ์ปจ ํ ์คํธ ๋ฅผ ์ฌ์ฉ ํ์ฌ Dispatcher Servlet ์ ๋ง ๋ญ ๋ ๋ค.
์ด๋ป๊ฒ ์คํ๋ง ๋ถ ํธ ๋ฅผ ์์ ํฉ ๋๊น?
Spring Boot ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๊ตฌ ์ ์@SpringBootApplication ์ฃผ์ ์ ์ฌ์ฉ ํ ๋ ํด๋์ค ์ ๋ ๋ค.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
๊ธฐ๋ณธ ์ ์ธ ์ํฉ ์์ springboot ์ ๋ด์ฅ ํ ์ฉ ๊ธฐ ๋ฅผ ์ฌ์ฉ ํ์ฌ ํ๋ก๊ทธ๋จ ์ ์คํ ํฉ ๋ ๋ค.์ด ์ ์์ springboot ๋ Public static void ๋ฉ ์ธ ์
๊ตฌ ์ ์ ์ฌ์ฉ ํ์ฌ ๋ด์ฅ ์น ์๋ฒ ๋ฅผ ์์ ํฉ ๋ ๋ค.๋ํ Servlet,Filter,servlet ContextInitializerbean ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ํ ๋ฌธ ์์ ์ฝ์ ์ Servlet ์ฉ๊ธฐ ๋ก ์ฐ๊ฒฐ ํ ๋ ์ผ ๋ ๋งก ๋ ๋ค.
springboot ์ ๋ ๋ค๋ฅธ ํน์ฑ ์ ์ฃผ ํด๋์ค ์ ๊ฐ์ ๊ฐ๋ฐฉ ์ด๋ ํ์ ํจํค์ง ์ ๋ชจ๋ ์ข ๋ฅ์ ๊ตฌ์ฑ ์ ์ ๋ฅผ ์๋ ์ผ๋ก ๊ฒ์ ํ ๋ ๊ฒ ์ ๋ ๋ค.
๋ํ,springboot ๋ ์ธ๋ถ ์ฉ๊ธฐ ์ ์ค ์น ๋ ์น ์์ถ ํ์ผ ์ ๋ฐฐ์น ํ ๋ ์ต์ ๋ ์ ๊ณต ํฉ ๋ ๋ค.์ด๋ฌํ ์ํฉ ์์ ์ฐ ๋ฆฌ ๋ SpringBoot ServletInitializer ๋ฅผ ํ์ฅ ํด ์ผ ํฉ ๋ ๋ค.
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
// ...
}
์ฌ๊ธฐ ์ ์ธ๋ถ servlet ์ฉ ๊ธฐ ๋ ์น ์ ์ ์ฅ ๋ META-INF ํ์ผ ์์ ์ ์ ๋ ์ฃผ ์ข
๋ฅ ๋ฅผ ์ฐพ ์ต ๋ ๋ค.SpringBootServletInitializer ๋ servlet,ํํฐ,ServletContextInitializer ๋ฅผ ์ฐ๊ฒฐ ํฉ ๋ ๋ค.ํฌ์ฅ ๋ฐ ๋ฐฐ์น
๋ง์ง๋ง ์ผ๋ก ์์ฉ ํ๋ก๊ทธ๋จ ์ ์ด๋ป๊ฒ ํฌ์ฅ ํ๊ณ ๋ฐฐ์น ํ ๋ ์ง ๋ณด ์ฌ ์ค ๋ ๋ค.์ด ๋ ํ๋ ์ ์ ํฌ ๋ ๋ชจ๋ Maven ๊ณผ Gradle ๋ฑ ํํ ๋ณผ ์ ์ ๋ ๊ฐ๋ฐฉ ๊ด๋ฆฌ ๊ธฐ์ ์ ์ง์ ํ๋ค.๊ทธ๋ฌ๋ ๋ฐฐ์น ์ ์์ด ์ ๋ ์ด๋ฐ ํ ์ด ํฌ๊ฒ ๋ค๋ฅด๋ค.
์ ๋ฅผ ๋ค ์ด springboot maven ํ๋ฌ๊ทธ ์ธ ์ Maven ์์ springboot ์ง์ ์ ์ ๊ณต ํฉ ๋ ๋ค.jar ๋ war ๋ฅผ ์คํ ํ ์ ์ ๋๋ก ํฌ์ฅ ํ๊ณ ํ๋ก๊ทธ๋จ ์'ํ์ง์์'์คํ ํ ์ ์ ์ต ๋ ๋ค.
๋ฐฐ์น ํ๊ฒฝ ์์ Spring Boot ๊ฐ Spring ๋ณด๋ค ์ข ์ ์ฅ์ ์ ๋ค์ ๊ณผ ๊ฐ๋ค.
๋ณธ ๋ ผ๋ฌธ ์์ ์ฐ ๋ฆฌ ๋ Spring ๊ณผ Spring Boot ๊ฐ ์ ์ฐจ ์ด ๋ฅผ ์ดํด ํ๋ค.
์ฝ๊ฒ ๋ง ํ๋ฉด spring boot ๋ Spring ์์ฒด ์ ํ์ฅ ์ผ ๋ฟ ๊ฐ๋ฐ,ํ ์คํธ ์ ๋ฐฐ ์น ๋ฅผ ๋์ฑ ํธ๋ฆฌ ํ ๊ฒ ํ๋ค ๊ณ ํ ์ ์๋ค.
์ด์ ์ Spring ๊ณผ SpringBoot ๊ฐ ์ ์ฐจ์ด ์ ๋ํ ์์ธ ํ ๋ด์ฉ ์ ๋ ๋ค.Spring ๊ณผ SpringBoot ์ ์ฐจ์ด ์ ๊ด ํ ์ ๋ฃ ๋ ๋ค๋ฅธ ๊ด๋ จ ๊ธ ์ ์ฃผ๋ชฉ ํ ์ธ ์!
์ด ๋ด์ฉ์ ํฅ๋ฏธ๊ฐ ์์ต๋๊น?
ํ์ฌ ๊ธฐ์ฌ๊ฐ ์ฌ๋ฌ๋ถ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ AI ์์ง์ ๋จธ์ ๋ฌ๋ ๋ถ์(์ค๋งํธ ๋ชจ๋ธ์ด ๋ฐฉ๊ธ ๋ง๋ค์ด์ ธ ๋ถ์ ํํ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์)์ ํตํด ๊ฐ์ฅ ์ ์ฌํ ๊ธฐ์ฌ๋ฅผ ์ถ์ฒํฉ๋๋ค:
[MeU] Hashtag ๊ธฐ๋ฅ ๊ฐ๋ฐโก๏ธ ๊ธฐ์กด Tag ํ ์ด๋ธ์ ์กด์ฌํ์ง ์๋ ํด์ํ๊ทธ๋ผ๋ฉด Tag , tagPostMapping ํ ์ด๋ธ์ ๋ชจ๋ ์ถ๊ฐ โก๏ธ ๊ธฐ์กด์ ์กด์ฌํ๋ ํด์ํ๊ทธ๋ผ๋ฉด, tagPostMapping ํ ์ด๋ธ์๋ง ์ถ๊ฐ ์ดํ์ ๊ฐ๋ฐํ ํ๊ทธ ๊ธฐ๋ฐ ...
ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
CC BY-SA 2.5, CC BY-SA 3.0 ๋ฐ CC BY-SA 4.0์ ๋ฐ๋ผ ๋ผ์ด์ผ์ค๊ฐ ๋ถ์ฌ๋ฉ๋๋ค.
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค