Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/main'
Browse files Browse the repository at this point in the history
  • Loading branch information
LeeChangYoon committed Aug 16, 2023
2 parents d320892 + 0f41467 commit 12e63b0
Show file tree
Hide file tree
Showing 25 changed files with 258 additions and 132 deletions.
11 changes: 2 additions & 9 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -86,14 +86,7 @@ sonarqube {
property "sonar.login", "admin"
property "sonar.password", "0520"
property "sonar.sources", "src"
property "sonar.language", "java" // 분석을 Java로 제한
property "sonar.language", "java"
property "sonar.sourceEncoding", "UTF-8"
// property "sonar.exclusions", "**/*Test*.*, **/Q*.JAVA"
// property "sonar.test.inclusions", "**/*Test.groovy, **/*Test.java"
// property "sonar.coverage.exclusions", "**/*Test*.*, **/Q*.java"
// property "sonar.java.junit.reportPaths", "${buildDir}/test-results"
// property "sonar.jacoco.reportPaths", "${buildDir}/jacoco/jacoco.exec"
// property "sonar.coverage.jacoco.xmlReportPaths", "build/reports/coverageReport/coverageReport.xml" // Test Coverage Report 생성한 경우 사용
// property 'sonar.exclusions', 'com/xxx/**/*_.java,com/**/QMyEntity.java,....'
}
}
}
33 changes: 19 additions & 14 deletions ml/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ def __init__(self, input_size, hidden_size, num_layers, output_size):
super(LSTMModel, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)

def forward(self, x):
out, _ = self.lstm(x)
out = self.fc(out)

return out

input_size = 13
input_size = 12
hidden_size = 64
num_layers = 2
output_size = 4
Expand All @@ -46,21 +46,26 @@ async def predict(input_data: str = Form(...),type_num: int = Form(...)):


# 모델에 대한 타입 지정을 num 에 해줘야함
# 모델의 타입은 직렬 정보에 따라서 1 = 2 = 3 = 4 = 5 = 6 =




# 모델의 타입은 직렬 정보에 따라서 1 = 2 = 3 = 4 = 5 = 6 =
model.load_state_dict(torch.load('lstm_model_'+str(type_num)+'.pth'))
model.eval()

input_data = ast.literal_eval(input_data)
filtered_values = [value for value in input_data if value != -1]
mean_value = np.mean(filtered_values)

input_data = [mean_value if value == -1 else value for value in input_data]
input_data.append(sum(input_data))

# 모두 0이면 리스트에 0 추가
if all(value == 0 for value in input_data):
input_data.append(0)
else:
# 0 값을 제외한 리스트 생성
filtered_values = [value for value in input_data if value != 0]

# 0이 없을 때만 평균값 계산 및 처리
if filtered_values:
mean_value = np.mean(filtered_values)
input_data = [mean_value if value == 0 else value for value in input_data]
input_data.append(sum(input_data))
else:
input_data.append(sum(input_data))

print(f"model input data is {input_data}")

result = predict_single_input(input_data)
Expand Down
53 changes: 30 additions & 23 deletions ml/train.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,12 @@ def data_preprocess(df):
df=data_preprocess(df)



type_1_df=df[df['applicationType']=='경찰직공무원(여)']
type_2_df=df[df['applicationType']=='경찰직공무원(남)']
type_1_df=df[df['applicationType']=='경찰직공무원(남)']
type_2_df=df[df['applicationType']=='경찰직공무원(여)']
type_3_df=df[df['applicationType']=='소방직공무원(남)']
type_4_df=df[df['applicationType']=='교정직공무원(남)']
type_5_df=df[df['applicationType']=='소방직공무원(여)']
type_6_df=df[df['applicationType']=='교정직공무원(여)']
type_4_df=df[df['applicationType']=='소방직공무원(여)']
type_5_df=df[df['applicationType']=='경호직공무원(남)']
type_6_df=df[df['applicationType']=='경호직공무원(여)']

type_1_df=type_1_df.drop('applicationType',axis=1)
type_2_df=type_2_df.drop('applicationType',axis=1)
Expand All @@ -50,7 +49,7 @@ def data_preprocess(df):
type_5_df=type_5_df.drop('applicationType',axis=1)
type_6_df=type_6_df.drop('applicationType',axis=1)


print(type_3_df)
def convert(df):

data = {
Expand All @@ -62,15 +61,15 @@ def convert(df):

# 피벗 테이블 생성
pivot_table = df.groupby(['member_id', 'month'])['score'].sum().unstack()

return pivot_table

type_1_df=convert(type_1_df)
type_2_df=convert(type_2_df)
type_3_df=convert(type_3_df)
type_4_df=convert(type_4_df)
type_5_df=convert(type_5_df)
type_6_df=convert(type_6_df)
type_1_df=convert(type_1_df)
type_2_df=convert(type_2_df)
type_3_df=convert(type_3_df)
type_4_df=convert(type_4_df)
type_5_df=convert(type_5_df)
type_6_df=convert(type_6_df)


type_1_df=type_1_df.fillna(type_1_df.mean())
Expand Down Expand Up @@ -106,24 +105,32 @@ def set_label(df):
type_6_df = set_label(type_6_df)


type_1_df=type_1_df.drop("total_score",axis=1)
type_2_df=type_2_df.drop("total_score",axis=1)
type_3_df=type_3_df.drop("total_score",axis=1)
type_4_df=type_4_df.drop("total_score",axis=1)
type_5_df=type_5_df.drop("total_score",axis=1)
type_6_df=type_6_df.drop("total_score",axis=1)




class LSTMModel(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super(LSTMModel, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)

def forward(self, x):
out, _ = self.lstm(x)
out,_= self.lstm(x)
out = self.fc(out) # Remove this line

return out

df_list=[type_1_df,type_2_df,type_3_df,type_4_df,type_5_df,type_6_df]
num=1
for i in df_list:

# Convert the DataFrame to PyTorch tensors
data_tensor = torch.tensor(i.drop(columns=['label']).values, dtype=torch.float32)
label_tensor = torch.tensor(i['label'].values, dtype=torch.long) # Change dtype to long
Expand All @@ -138,7 +145,7 @@ def forward(self, x):
test_labels = label_tensor[train_size:]

# Create an instance of the LSTMModel
input_size = 13
input_size = 12
hidden_size = 64
num_layers = 2
output_size = 4
Expand All @@ -153,13 +160,13 @@ def forward(self, x):
for epoch in range(num_epochs):
model.train()
optimizer.zero_grad()

outputs = model(train_data)
loss = criterion(outputs.squeeze(), train_labels) # Remove the dimension from outputs

loss.backward()
optimizer.step()

if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

Expand Down
Binary file modified redis/data/dump.rdb
Binary file not shown.
29 changes: 29 additions & 0 deletions src/main/java/se/ton/t210/configuration/RestConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package se.ton.t210.configuration;

import com.fasterxml.jackson.databind.ObjectMapper;
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.web.client.RestTemplate;

@Configuration
public class RestConfig {

@Bean
public HttpHeaders headers() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
return headers;
}

@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}

@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
15 changes: 12 additions & 3 deletions src/main/java/se/ton/t210/configuration/TokenFilterConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,15 @@ public FilterRegistrationBean<Filter> addAccessTokenFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new TokenFilter(tokenSecret, accessTokenCookieKey));
filterRegistrationBean.addUrlPatterns(
"/api/reissue/token",
"/html/dashboard.html",
"/html/personal-information.html",
"/html/record.html",
"/html/application-information1.html",
"/html/application-information2.html",
"/html/application-information3.html",
"/html/application-information4.html",
"/html/application-information5.html",
"/html/application-information6.html",
"/html/setting-account.html"
);
return filterRegistrationBean;
Expand All @@ -45,15 +50,19 @@ public FilterRegistrationBean<Filter> addAccessTokenFilter() {
public FilterRegistrationBean<Filter> addRefreshTokenFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new TokenFilter(tokenSecret, refreshTokenCookieKey));
filterRegistrationBean.addUrlPatterns("/api/reissue/token");
filterRegistrationBean.addUrlPatterns(
"/api/reissue/token"
);
return filterRegistrationBean;
}

@Bean
public FilterRegistrationBean<Filter> addEmailTokenFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new TokenFilter(tokenSecret, emailAuthTokenCookieKey));
filterRegistrationBean.addUrlPatterns("/api/member/signUp");
filterRegistrationBean.addUrlPatterns(
"/api/member/signUp"
);
return filterRegistrationBean;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
secret.validateToken(refreshToken);
} catch (AuthException e) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.sendRedirect("/html/error-401.html");
response.sendRedirect("/html/sign-in.html");
response.getOutputStream().write(e.getMessage().getBytes());
return;
}
Expand Down
34 changes: 34 additions & 0 deletions src/main/java/se/ton/t210/controller/PageController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package se.ton.t210.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import se.ton.t210.configuration.annotation.LoginMember;
import se.ton.t210.domain.type.ApplicationType;
import se.ton.t210.dto.LoginMemberInfo;

@Controller
public class PageController {

@GetMapping("/html/application-information")
public String information(@LoginMember LoginMemberInfo memberInfo) {
if(memberInfo.getApplicationType() == ApplicationType.PoliceOfficerMale) {
return "redirect:/html/application-information1.html";
}
if(memberInfo.getApplicationType() == ApplicationType.PoliceOfficerFemale) {
return "redirect:/html/application-information2.html";
}
if(memberInfo.getApplicationType() == ApplicationType.FireOfficerMale) {
return "redirect:/html/application-information3.html";
}
if(memberInfo.getApplicationType() == ApplicationType.FireOfficerFemale) {
return "redirect:/html/application-information4.html";
}
if(memberInfo.getApplicationType() == ApplicationType.CorrectionalOfficerFemale) {
return "redirect:/html/application-information5.html";
}
if(memberInfo.getApplicationType() == ApplicationType.CorrectionalOfficerMale) {
return "redirect:/html/application-information6.html";
}
return "/html/application-information1.html";
}
}
16 changes: 9 additions & 7 deletions src/main/java/se/ton/t210/controller/ScoreController.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package se.ton.t210.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import se.ton.t210.configuration.annotation.LoginMember;
import se.ton.t210.domain.Member;
import se.ton.t210.domain.type.ApplicationType;
import se.ton.t210.dto.*;
import se.ton.t210.service.ScoreService;

Expand All @@ -32,8 +34,8 @@ public ResponseEntity<ScoreCountResponse> scoreCount(@LoginMember LoginMemberInf

@GetMapping("/api/score/evaluate")
public ResponseEntity<CalculateEvaluationScoreResponse> evaluationScore(
@Valid @NotNull Long evaluationItemId,
@Valid @NotNull Float score) {
@Valid @NotNull Long evaluationItemId,
@Valid @NotNull Float score) {
final int evaluationScore = scoreService.evaluate(evaluationItemId, score);
return ResponseEntity.ok(new CalculateEvaluationScoreResponse(evaluationScore));
}
Expand All @@ -45,8 +47,8 @@ public ResponseEntity<List<MonthlyScoreResponse>> scores(@LoginMember LoginMembe
}

@GetMapping("/api/score/expect")
public ResponseEntity<ExpectScoreResponse> expect(@LoginMember LoginMemberInfo member) {
final ExpectScoreResponse scoreResponse = scoreService.expect(member.getId(), member.getApplicationType(), LocalDate.now());
public ResponseEntity<ExpectScoreResponse> expect(@LoginMember LoginMemberInfo member) throws JsonProcessingException {
final ExpectScoreResponse scoreResponse = scoreService.expect(member, LocalDate.now());
return ResponseEntity.ok(scoreResponse);
}

Expand Down
27 changes: 12 additions & 15 deletions src/main/java/se/ton/t210/domain/type/ApplicationType.java
Original file line number Diff line number Diff line change
@@ -1,35 +1,32 @@
package se.ton.t210.domain.type;

public enum ApplicationType {
PoliceOfficerMale("/static/default.jpg", "경찰직공무원(남)"),
PoliceOfficerFemale("/static/default.jpg", "경찰직공무원(여)"),
FireOfficerMale("/static/default.jpg", "소방직공무원(남)"),
FireOfficerFemale("/static/default.jpg", "소방직공무원(여)"),
CorrectionalOfficerMale("/static/default.jpg", "경호직공무원(남)"),
CorrectionalOfficerFemale("/static/default.jpg", "경호직공무원(여)");
PoliceOfficerMale("/static/default.jpg", "경찰직공무원(남)", 1),
PoliceOfficerFemale("/static/default.jpg", "경찰직공무원(여)", 2),
FireOfficerMale("/static/default.jpg", "소방직공무원(남)", 3),
FireOfficerFemale("/static/default.jpg", "소방직공무원(여)", 4),
CorrectionalOfficerMale("/static/default.jpg", "경호직공무원(남)", 5),
CorrectionalOfficerFemale("/static/default.jpg", "경호직공무원(여)", 6);

private final String iconImageUrl;
private final String standardName;
private final int mlServerIndex;

ApplicationType(String iconImageUrl, String standardName) {
ApplicationType(String iconImageUrl, String standardName, int mlServerIndex) {
this.iconImageUrl = iconImageUrl;
this.standardName = standardName;
this.mlServerIndex = mlServerIndex;
}

public String getStandardName() {
public String standardName() {
return standardName;
}

public String iconImageUrl() {
return iconImageUrl;
}

public static String getKeyByName(String name) {
for (ApplicationType ApplicationType : values()) {
if (ApplicationType.standardName.equals(name)) {
return ApplicationType.toString();
}
}
return null;
public int mlServerIndex() {
return mlServerIndex;
}
}
Loading

0 comments on commit 12e63b0

Please sign in to comment.