Skip to content

Commit

Permalink
Merge pull request #2 from gengminy/feat/sms
Browse files Browse the repository at this point in the history
🚀 feat(sms): 문자메세지 발송 구현 #1
  • Loading branch information
gengminy authored Sep 10, 2022
2 parents 0c12560 + 4c42ee6 commit 014337e
Show file tree
Hide file tree
Showing 31 changed files with 683 additions and 11 deletions.
Binary file added .DS_Store
Binary file not shown.
33 changes: 33 additions & 0 deletions .github/ISSUE_TEMPLATE/---feature-template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
---
name: "\U0001F680 Feature Template"
about: 기능 추가에 대한 작업 사항을 적습니다
title: "\U0001F680[Feature] - "
labels: ''
assignees: ''

---

# 🚀 Feature - <!--{ 작업 내용 }-->
<!-- 위 작업내용 주석에 어떤 기능인지 적어주세요-->


### 📝 Description

---
<!-- 아래에 설명을 적어주세요 -->
설명을 작성해주세요


### ✅ To Do List

---
<!-- 아래에 어떤 작업을 해야 하는지 적어주세요 -->
- [ ] 작업1
- [ ] 작업2

### 📚 Etc

---
<!-- 작업 중 특이사항이 생기면 적어주세요 -->
특이사항

32 changes: 32 additions & 0 deletions .github/ISSUE_TEMPLATE/---refactor-template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
name: "\U0001F528 Refactor Template"
about: 리팩토링 관련 작업 사항을 적습니다
title: "\U0001F528 Refactor - "
labels: ''
assignees: ''

---

# 🔨 Refactor - <!--{ 작업 내용 }-->
<!-- 위 작업내용 주석에 어떤 오류인지 적어주세요-->

### 📝 Description

---
<!-- 어떤 리팩토링 작업을 했는지 적어주세요 -->
리팩토링 작업 사항

### ✅ To Do List

---
<!-- 아래에 수정 사항을 적어주세요 PR 날릴 때 모두 체크되어야함 -->
- [ ] 수정1
- [ ] 수정2

### 📚 Etc

---
<!-- 작업 중 특이사항이 생기면 적어주세요 -->
특이사항


38 changes: 38 additions & 0 deletions .github/ISSUE_TEMPLATE/-bug-report-template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
name: "❌Bug Report Template"
about: 버그가 발생한 상황과 수정 내역을 적습니다
title: "\U0001F41E Bug - "
labels: ''
assignees: ''

---

# 🐞 Bug - <!--{ 작업 내용 }-->
<!-- 위 작업내용 주석에 어떤 오류인지 적어주세요-->


### 🕵️‍♀️ Condition

---
<!-- 아래에 버그가 발생한 상황을 적어주세요 -->
에러 발생 조건 및 대상

### 📝 Description

---
<!-- 아래에 버그가 발생한 상황을 적어주세요 -->
에러 발생 상황 설명

### ✅ To Do List

---
<!-- 아래에 수정 사항을 적어주세요 PR 날릴 때 모두 체크되어야함 -->
- [ ] 수정1
- [ ] 수정2

### 📚 Etc

---
<!-- 작업 중 특이사항이 생기면 적어주세요 -->
특이사항

28 changes: 28 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# 💡 PR Summary - <!--{ 작업 내용 }-->
<!-- 어떤 작업에 대한 PR 인지 위 주석에 적어주세요 -->

### 📝 Description

---
<!-- 어떤 작업을 했는지 간단하게 적어주세요 -->
작업 사항

### 🌲 Working Branch

---
<!-- 예시) feature/user -->
작업 브랜치

### 📖 Related Issues

---
<!-- 예시) #1 -->
이슈 번호


### 📚 Etc

---
<!-- 작업 중 특이사항이 생기면 적어주세요 -->
특이사항

4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-webflux'

//json
implementation group: 'org.json', name: 'json', version: '20220320'
Expand All @@ -35,6 +36,9 @@ dependencies {
//jwt
implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'

//coolsms
implementation 'net.nurigo:sdk:4.2.4'

//swagger openapi
implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'io.springfox:springfox-swagger-ui:3.0.0'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing //jpa entity 자동 감시
public class NaechinsoApplication {

public static void main(String[] args) {
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/tikitaka/naechinso/config/CommonApiResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,21 @@ public class CommonApiResponse<T> {
private boolean success;
private T data;

/**
* Http Response 를 내보낼 때 사용, 데이터를 Json 형식으로 만든다
* default status code : 200
* @param data 내보낼 데이터
* */
public static <T> CommonApiResponse<T> of(T data) {
return new CommonApiResponse<>(200, true, data);
}

/**
* Http Response 를 내보낼 때 사용, 데이터를 Json 형식으로 만든다
* 추가적으로 status code도 지정한다
* @param data 내보낼 데이터
* @param status 응답 status code 지정
* */
public static <T> CommonApiResponse<T> of(T data, int status) {
return new CommonApiResponse<>(status, true, data);
}
Expand Down
40 changes: 40 additions & 0 deletions src/main/java/com/tikitaka/naechinso/config/RedisConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.tikitaka.naechinso.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/** Redis 설정입니다
* @author gengminy (220812) */
@Configuration
public class RedisConfig {
@Value("${REDIS_HOST}")
private String host;

@Value("${REDIS_PORT}")
private int port;

@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}

@Bean
public RedisTemplate<String, String> redisTemplate() {
// redisTemplate를 받아와서 set, get, delete를 사용
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
/**
* setKeySerializer, setValueSerializer 설정
* redis-cli을 통해 직접 데이터를 조회 시 알아볼 수 없는 형태로 출력되는 것을 방지
*/
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory());

return redisTemplate;
}
}
97 changes: 97 additions & 0 deletions src/main/java/com/tikitaka/naechinso/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.tikitaka.naechinso.config;


import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.CorsUtils;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

/** 인증 및 Security 관련 설정 클래스입니다
* @author gengminy (220728) */
@EnableWebSecurity
@RequiredArgsConstructor
@Configuration
public class SecurityConfig {
private static final String[] SwaggerPatterns = {
"/swagger-resources/**",
"/swagger-ui.html",
"/v2/api-docs",
"/webjars/**"
};
// private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
// private final JwtAuthenticationFilter jwtAuthenticationFilter;
// private final JwtAccessDeniedHandler jwtAccessDeniedHandler;


@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.cors().configurationSource(corsConfigurationSource())
.and()
.csrf().disable()
//예외처리 핸들러
.exceptionHandling()
// .authenticationEntryPoint(jwtAuthenticationEntryPoint)
// .accessDeniedHandler(jwtAccessDeniedHandler)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.httpBasic().disable()
//권한이 필요한 요청에 대한 설정
.authorizeRequests()
.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
.antMatchers(SwaggerPatterns).permitAll()
.antMatchers("/admin/**").hasAuthority("ROLE_ADMIN")
.antMatchers("/user/**").authenticated()
.anyRequest().permitAll()
.and()
.headers().frameOptions().disable();
// .and()
// .oauth2Login()
// .defaultSuccessUrl("/login-success")
// .successHandler(oAuth2AuthenticationSuccessHandler)
// .userInfoEndpoint()
// .userService(customOAuth2Service);

// http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
// 검토 필요
}

/** cors 설정 configuration bean */
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

//로컬 react 개발 환경
configuration.addAllowedOriginPattern("*");
//서버 react 프론트 환경
configuration.addAllowedHeader("*");
configuration.addAllowedMethod("*");
configuration.addExposedHeader("x-auth-token");
//내 서버의 응답 json 을 javascript에서 처리할수 있게 하는것(axios 등)
configuration.setAllowCredentials(true);
configuration.setMaxAge(3600L);

source.registerCorsConfiguration("/**", configuration);
return source;
}

/** 비밀번호 암호화 bcrypt Encoder 설정 */
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@

import java.util.*;

/**
* Swagger 사용 환경을 위한 설정 파일
* */
@Configuration
@EnableWebMvc
public class SwaggerConfig {
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/com/tikitaka/naechinso/config/WebClientConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.tikitaka.naechinso.config;

import io.netty.channel.ChannelOption;
import io.netty.handler.timeout.ReadTimeoutHandler;
import io.netty.handler.timeout.WriteTimeoutHandler;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;

/**
* Web Client 사용 환경을 위한 설정 파일
* */
@Configuration
public class WebClientConfig {

@Bean
public WebClient webClient() {
HttpClient httpClient = HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
.responseTimeout(Duration.ofMillis(5000))
.doOnConnected(connection -> {
connection.addHandlerLast(new ReadTimeoutHandler(5000, TimeUnit.MILLISECONDS))
.addHandlerLast(new WriteTimeoutHandler(5000, TimeUnit.MILLISECONDS));
});

WebClient webClient = WebClient.builder()
.defaultHeader(HttpHeaders.CONTENT_TYPE, String.valueOf(MediaType.APPLICATION_JSON))
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();

httpClient.warmup().block();

return webClient;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.tikitaka.naechinso.constant;

public enum DeleteStatus {
Y,N
}
Loading

0 comments on commit 014337e

Please sign in to comment.