From 8db18696d18e3901dca9a5dea74f7575fd414357 Mon Sep 17 00:00:00 2001 From: cocagolau Date: Tue, 12 May 2015 09:05:18 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=EC=A4=91=EA=B0=84=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/applicationContext.xml | 9 ++++++++- src/candrun/controller/GoalsController.java | 17 +++++++++++++---- src/candrun/scheduled/DailyInitializeJob.java | 5 +++++ src/candrun/service/aspect/SecurityAspect.java | 17 +++++++++++++++++ 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/resources/applicationContext.xml b/resources/applicationContext.xml index 6f1d65d..0df060d 100644 --- a/resources/applicationContext.xml +++ b/resources/applicationContext.xml @@ -38,7 +38,14 @@ - + + diff --git a/src/candrun/controller/GoalsController.java b/src/candrun/controller/GoalsController.java index 2de5c50..4356007 100644 --- a/src/candrun/controller/GoalsController.java +++ b/src/candrun/controller/GoalsController.java @@ -27,14 +27,18 @@ public class GoalsController { private static final Logger LOGGER = LoggerFactory .getLogger(TasksController.class); private static final int maxTasksNumber = 5; + + /* + * 특별한 이유가 없는한 private을 붙여주는게 좋습니다. + */ @Autowired - GoalDAO goalDao; + private GoalDAO goalDao; @Autowired - TaskDAO taskDao; + private TaskDAO taskDao; @Autowired - GoalService goalService; + private GoalService goalService; @Autowired - TaskService taskService; + private TaskService taskService; @RequestMapping(method = RequestMethod.POST) public Object create(@RequestParam("goal_contents") String goalContents, @@ -44,6 +48,11 @@ public Object create(@RequestParam("goal_contents") String goalContents, ArrayList tasks = new ArrayList(); for (int i = 0; i < maxTasksNumber; i++) { + /* + * 클라이언트에서 값을 전달할 때부터 배열이면 좋을 것 같아요. + * - 클라참고: http://goo.gl/BORzx6 + * - 서버참고: http://goo.gl/rCZ3Jq + */ String taskContents = req.getParameter("task_contents_" + i); if (taskContents == null) break; tasks.add(taskContents); diff --git a/src/candrun/scheduled/DailyInitializeJob.java b/src/candrun/scheduled/DailyInitializeJob.java index 684a980..6997287 100644 --- a/src/candrun/scheduled/DailyInitializeJob.java +++ b/src/candrun/scheduled/DailyInitializeJob.java @@ -6,6 +6,11 @@ import candrun.dao.TaskDAO; +/* + * 스프링3 @Scheduled 어노테이션으로 job을 지원하고 있습니다 ㅠㅠ + * - 참고: http://jsonobject.tistory.com/101 + * - 주의사항: xml에 task 설정시 task namespace 꼭 확인 바랍니다. + */ public class DailyInitializeJob extends QuartzJobBean{ TaskDAO taskDao; diff --git a/src/candrun/service/aspect/SecurityAspect.java b/src/candrun/service/aspect/SecurityAspect.java index b3b2c6e..dba7f84 100644 --- a/src/candrun/service/aspect/SecurityAspect.java +++ b/src/candrun/service/aspect/SecurityAspect.java @@ -5,9 +5,11 @@ import javax.servlet.http.HttpSession; +import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,6 +26,21 @@ public class SecurityAspect { + "|| execution(public * candrun.controller.AuthController.signIn(..))") public void decrypUserInfo() { }; + + /* + * 돌려보지는 않았지만 before만 쓴다면 이게 조금 더 명확할 것 같아요!! + * + @Before("decrypUserInfo()") + public void beforeRegister(JoinPoint joinPoint) throws Throwable { + Object[] args = joinPoint.getArgs(); + logger.debug("before start method"); + PrivateKey privateKey = (PrivateKey) ((HttpSession) args[0]) + .getAttribute(Security.RSA_PRI_KEY.getValue()); + args[1] = SecurityService.decrytRsa(privateKey, (String) args[1]); + args[2] = SecurityService.decrytRsa(privateKey, (String) args[2]); + logger.debug("email: " + (String) args[1] + "/" + "password: " + (String) args[2]); + } + */ @SuppressWarnings("unchecked") @Around("decrypUserInfo()") From 2a98e0a47fee4a8d66c2f68f1221e8e4c40232e3 Mon Sep 17 00:00:00 2001 From: cocagolau Date: Tue, 12 May 2015 11:23:03 +0900 Subject: [PATCH 2/3] =?UTF-8?q?150511=20=EB=A6=AC=EB=B7=B0=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 +++++ resources/applicationContext.xml | 18 +++++++++++ src/candrun/dao/TaskDAO.java | 31 +++++++++++++++++++ src/candrun/model/User.java | 31 +++++++++++++++++++ src/candrun/service/GoalService.java | 28 +++++++++++++++++ src/candrun/service/UserService.java | 22 +++++++++++++ .../service/aspect/SecurityAspect.java | 2 +- src/candrun/support/enums/CommonInvar.java | 12 +++++++ src/candrun/support/enums/UserErrorcode.java | 12 +++++++ 9 files changed, 163 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 82d545c..816f1db 100644 --- a/pom.xml +++ b/pom.xml @@ -55,6 +55,14 @@ 1.10.19 test + + + + org.hamcrest + hamcrest-all + 1.3 + test + com.google.guava diff --git a/resources/applicationContext.xml b/resources/applicationContext.xml index 0df060d..52a8bba 100644 --- a/resources/applicationContext.xml +++ b/resources/applicationContext.xml @@ -12,6 +12,24 @@ location="classpath:local-properties/database.properties, classpath:local-properties/mailSender.properties, classpath:local-properties/mailMessage.properties" /> + + + + + getTasksByGoalId(int goalId) { + String sql = "SELECT * FROM tasks WHERE goal_id = ? LIMIT 3"; + return this.jdbcTemplate.query(sql, new TaskMapper(), goalId); + } + */ + public class TaskDAO extends JdbcDaoSupport { private static final class TaskMapper implements RowMapper { diff --git a/src/candrun/model/User.java b/src/candrun/model/User.java index 9db760f..cc94726 100644 --- a/src/candrun/model/User.java +++ b/src/candrun/model/User.java @@ -1,5 +1,8 @@ package candrun.model; + + + public class User { private String email; private String nickname; @@ -7,6 +10,8 @@ public class User { private String picPath; private int state; + public User() { } + public User(String email, String nickname, String password, String picPath) { this.email = email; this.nickname = nickname; @@ -38,6 +43,32 @@ public int getState() { return state; } + /* + * @see candrun.model.User + * @see candrun.model.UserTest + * @see candrun.service.UserService + * + * @see candrun.support.enums.Value + * @see candrun.support.enums.UserErrorcode + * @see candrun.support.enums.CommonInvar + * + + 이때 주의할 점은 같은 타입으로 반환해야하는데요. + 제 생각엔 enum에 value타입을 지정하여 통일시켜주는게 좋을것 같아요. + + public Value getEnumState() { + + switch (state) { + case 0 : + return UserErrorcode.NOT_YET_CERTI; + case 1 : + return CommonInvar.SUCCESS; + default : + return CommonInvar.DEFAULT; + } + } + */ + public String getPicPath() { return picPath; } diff --git a/src/candrun/service/GoalService.java b/src/candrun/service/GoalService.java index d2cd8d8..2a7dd1d 100644 --- a/src/candrun/service/GoalService.java +++ b/src/candrun/service/GoalService.java @@ -19,6 +19,34 @@ import candrun.support.enums.GoalState; import candrun.support.enums.RelationRequestState; +/* + * applicationContext에서 component-sacn을 사용할 때 예제입니다 + * + +@Service +public class GoalService { + private static final Logger logger = LoggerFactory + .getLogger(GoalService.class); + + @Autowired + private GoalDAO goalDao; + + @Autowired + private UserDAO userDao; + + @Autowired + private TaskDAO taskDao; + + // 개별적인 DI를 수행하므로 아래 생성자는 필요 없습니다. + public GoalService(GoalDAO goalDao, UserDAO userDao, TaskDAO taskDao) { + this.goalDao = goalDao; + this.userDao = userDao; + this.taskDao = taskDao; + } + + public List getGoalRelations(String email) { ... + */ + public class GoalService { private static final Logger logger = LoggerFactory .getLogger(GoalService.class); diff --git a/src/candrun/service/UserService.java b/src/candrun/service/UserService.java index 0f2b5b6..3e0687f 100644 --- a/src/candrun/service/UserService.java +++ b/src/candrun/service/UserService.java @@ -44,6 +44,28 @@ public String login(String email, String pw, HttpSession session) return UserErrorcode.WRONG_PW.getValue(); } + /* + * @see candrun.model.User + * @see candrun.model.UserTest + * @see candrun.service.UserService + * + * @see candrun.support.enums.Value + * @see candrun.support.enums.UserErrorcode + * @see candrun.support.enums.CommonInvar + + 객체지향의 특징은 문제를 요청하고 결과를 받는다는 것입니다. + 보통은 이것을 객체간 메시지를 주고 받는다고 하더라구요. + + 지금의 코드는 다음과 같이 변경하면 좋을 것 같아요. + 이러한 코드의 장점은 핵심 로직을 분리하여 유지보수가 쉽고, 가독성도 높아지고, 테스트도 좋아집니다. + + userState = user.getEnumState(); + if (CommonInvar.SUCCESS.equals(userState) { + session.setAttribute("email", email); + } + return userState.getValue(); + + */ userState = user.getState(); if (userState == 0) { return UserErrorcode.NOT_YET_CERTI.getValue(); diff --git a/src/candrun/service/aspect/SecurityAspect.java b/src/candrun/service/aspect/SecurityAspect.java index dba7f84..e483739 100644 --- a/src/candrun/service/aspect/SecurityAspect.java +++ b/src/candrun/service/aspect/SecurityAspect.java @@ -31,7 +31,7 @@ public void decrypUserInfo() { * 돌려보지는 않았지만 before만 쓴다면 이게 조금 더 명확할 것 같아요!! * @Before("decrypUserInfo()") - public void beforeRegister(JoinPoint joinPoint) throws Throwable { + public void beforeRegister(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); logger.debug("before start method"); PrivateKey privateKey = (PrivateKey) ((HttpSession) args[0]) diff --git a/src/candrun/support/enums/CommonInvar.java b/src/candrun/support/enums/CommonInvar.java index e36a032..d1c44fa 100644 --- a/src/candrun/support/enums/CommonInvar.java +++ b/src/candrun/support/enums/CommonInvar.java @@ -1,5 +1,17 @@ package candrun.support.enums; +/* + * @see candrun.model.User + * @see candrun.model.UserTest + * @see candrun.service.UserService + * + * @see candrun.support.enums.Value + * @see candrun.support.enums.UserErrorcode + * + * enum interfcae를 구성하여 지정하면 Vaule타입으로 통합될 수 있습니다 + */ + +//public enum CommonInvar implements Value { public enum CommonInvar { ERRORCODE ("errorCode"), RETURNMSG ("returnMsg"), diff --git a/src/candrun/support/enums/UserErrorcode.java b/src/candrun/support/enums/UserErrorcode.java index fce0b33..5cee946 100644 --- a/src/candrun/support/enums/UserErrorcode.java +++ b/src/candrun/support/enums/UserErrorcode.java @@ -1,5 +1,17 @@ package candrun.support.enums; +/* + * @see candrun.model.User + * @see candrun.model.UserTest + * @see candrun.service.UserService + * + * @see candrun.support.enums.Value + * @see candrun.support.enums.CommonInvar + * + * enum interfcae를 구성하여 지정하면 Vaule타입으로 통합될 수 있습니 + */ + +//public enum UserErrorcode implements Value { public enum UserErrorcode { EMPTY ("empty"), DUP ("dup"), From 9fc4a96e6a384a62d0f9e207b50f35d479a4c1cc Mon Sep 17 00:00:00 2001 From: cocagolau Date: Tue, 12 May 2015 11:46:08 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/candrun/support/enums/Value.java | 17 ++++++++++ test/candrun/model/UserTest.java | 49 ++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/candrun/support/enums/Value.java create mode 100644 test/candrun/model/UserTest.java diff --git a/src/candrun/support/enums/Value.java b/src/candrun/support/enums/Value.java new file mode 100644 index 0000000..8d792b0 --- /dev/null +++ b/src/candrun/support/enums/Value.java @@ -0,0 +1,17 @@ +package candrun.support.enums; + + +/* + * @see candrun.model.User + * @see candrun.model.UserTest + * @see candrun.service.UserService + * + * @see candrun.support.enums.Value + * @see candrun.support.enums.UserErrorcode + * @see candrun.support.enums.CommonInvar + */ +public interface Value { + + String getValue(); + +} diff --git a/test/candrun/model/UserTest.java b/test/candrun/model/UserTest.java new file mode 100644 index 0000000..93985e7 --- /dev/null +++ b/test/candrun/model/UserTest.java @@ -0,0 +1,49 @@ +package candrun.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +import java.lang.reflect.Field; + +import org.junit.Test; + +import candrun.support.enums.CommonInvar; +import candrun.support.enums.UserErrorcode; + +public class UserTest { +/* + @Test + public void getEnumState_S_state가_0일때() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { + // defualt 생성자 필요 + User user = new User(); + Field field = User.class.getDeclaredField("state"); + field.setAccessible(true); + field.set(user, 0); + + assertThat(user.getEnumState(), equalTo(UserErrorcode.NOT_YET_CERTI)); + } + + @Test + public void getEnumState_S_state가_1일때() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { + // defualt 생성자 필요 + User user = new User(); + Field field = User.class.getDeclaredField("state"); + field.setAccessible(true); + field.set(user, 1); + + assertThat(user.getEnumState(), equalTo(CommonInvar.SUCCESS)); + } + + @Test + public void getEnumState_S_state가_0_1이_아닐때() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { + // defualt 생성자 필요 + User user = new User(); + Field field = User.class.getDeclaredField("state"); + field.setAccessible(true); + field.set(user, 1000); + + assertThat(user.getEnumState(), equalTo(CommonInvar.DEFAULT)); + } +*/ + +}