간단하게 할 수 있으면 간단하게 해라. 맞지 않나? 간단히 할 수 있는일을 왜 안 간단하게 하는지 모르겠다. 무슨 디커플링 어쩌구 하는데, 단 한번 쓰일 메서드 내지는 다음에 쓰일지 말지 애매한 메서드까지 왜 서비스 레이어 위에 올리는걸까? 왜 소스코드를 늘리고 더 복잡하게 만드는걸까? 이해가 안된다. 간단히 Authentication 만 봐도 그렇다. 인증 과정이 여러 포인트에서 지금 당장 일어나고 있다면 모를까, 최초 코드 작성시점에서 벌써 그런 사정을 고려할 필요는 없다. 이게 스프링 커뮤니티에서 추천하는 jdk프록시와 만나 impl 서비스 레이어를 만드는 것으로 더 복잡해진다.
LoginController
-> LoginService
-> LoginServiceImpl
-> UserDao
-> UserMapper
컨트롤러에 비즈니스 로직을 집어넣는것이 나쁘다 (내지는 바람직하지 않다) 고 하는게 널리 알려진 말이지만, 지금껏 경험한 바로는 그런 말이 이해가 안될정도로, 그저 똑같은 메서드를 가진 서비스 클래스를 하나 더 만들뿐이다.
어떤 개념을 하나 더 두는것이 아무리 일정한 컨벤션을 가지고 있고 나중에 쓸모가 있을지도 모른다 할지라도 가장 좋은건 그냥 없는게 가장 좋지 않나?
예를들면 인증은 그냥 이런 코드로도 충분하지 않나 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@Controller
public class RootController {
@Resource (name = "session" )
Session session;
@Inject
UserMapper userMapper;
@Inject
PostMapper postMapper;
@Inject
FooService fooService;
@RequestMapping ("/" )
public String root () {
if (session.getUser() == null )
return "redirect:/page/hello" ;
else
return "redirect:/page/home" ;
}
@Authorized (to = Type.PUBLIC)
@RequestMapping ("/page/hello" )
public String hello () {
return "/jsp/hello.jsp" ;
}
@RequestMapping ("/page/home" )
public ModelAndView home () {
List<Post> posts = postMapper.select();
return new ModelAndView("/jsp/home.jsp" ).addObject("posts" , posts);
}
@Authorized (to = Type.PUBLIC)
@RequestMapping ("/proc/login" )
public String login (
@RequestParam(required = true ) String name,
@RequestParam (required = true ) String password
) {
User user = userMapper.selectByLogin(name, password);
if (user == null )
throw new NoSuchUserException();
session.setUser(user);
return "redirect:/" ;
}
@RequestMapping ("/proc/logout" )
public String logout () {
session.setUser(null );
return "redirect:/" ;
}
}