안녕하세요, Brad입니다. 오늘은 어제 미션을 진행한 부분에 대한 피드백을 반영하는 것인데요. 오늘도 진행하면서 많은 것들을 배울 수 있었습니다. 그럼 한번 정리해볼게요!
@RequestMapping 적용해보기
@RequestMapping 은 Controller 내에서 Mapping을 할때 공통되는 부분을 처리해주는 어노테이션입니다. 위와 같이 클래스 위에다 적어주면 그 안의 Mapping에서 예를들어 "/questions/form" 이라면 "/form"만 적어도 되는 것이죠. 그런데 이렇게 고치니까 저의 경우 문제가 되었습니다. 왜냐하면 이번 미션에서 index.html부분에서 질문 데이터들이 나오는데 클래스 차원에서 저렇게 매핑해버리니까 'localhost:8080/questions/'까지 치면 질문 데이터들이 제대로 나오는데 일반적으로 접속하는 'localhost:8080'에서는 데이터들을 안 넘겨주니까(Controller에서 매핑된 메서드를 못 거치니까) 안 나오는 것입니다. 이것에 대한 해결은 조금 있다가 설명하겠습니다.
그런데 또 다른 문제는 'localhost:8080/questions/'까지 치면 제대로 나오는데 'localhost:8080/questions'를 치면 Mapping이 안되더라구요. 마지막 /
도 있어야 제대로 작동하더라구요.
이 경우 위와 같이 url에서 /
없어야 /
유무에 상관없이 제대로 작동하는 것을 알수 있었습니다. 또 @GetMapping
옆에 ("")가 없더라도 제대로 작동하는 것을 확인하였습니다.
위 같은 테스트들은 통해서 @ReqeustMapping
이 Controller안에서 따로 @PostMapping
이나 @GetMapping
옆에 '/questions'를 안 붙여도 되어 중복을 피할 수 있게해주었고 아래와 같이 고칠 수 있었습니다(QuestionController
말고도 UserController
내에서도 @RequestMapping
을 통해 중복되는 코드를 줄일 수 있었습니다).
여기서 redirect 뒤 '/questions'가 붙여있습니다. 저는 @RequestMapping
이 여기도 적용되어서 /
만 써도 되는 줄 알았거든요. 그런데 그렇게 하면 index.html 로 가더라구요. 그래서 redirect뒤엔 절대경로로써 사용되어야 하는 것을 알 수 있었습니다.
그리고 아까 'localhost:8080'으로 접근했을 때 넣어둔 데이터들이 안나오는 문제를 말했었는데요. 그 부분은 따로 컨트롤러를 만들어서 index.html로 연결했을 때 'localhost:8080/questions'로 redirect하게끔 설정하여 해결하였습니다. 그런데 css가 깨지는 문제가 있어서 해결하는데 시간을 좀 보냈습니다.
전 위에서 @GetMapping
옆에 아무것도 없으면 그냥 루트로 인식할 줄 알고 없이 쓰고 redirect했었거든요. 그런데 그것이 문제였습니다. 아래 방법들처럼 명시적으로 ("/") 나 ("")를 써줘야 해결가능하더라구요. @RequestMapping
의 유무 차이일지도 모르겠습니다.
List데이터를 역순으로 전달하려면?
Question
데이터가 List안에 담겨져있었거든요. 그런데 가장 최신 글을 제일 위에 나오게 하려면 역순이 필요하였습니다. 기존에 Collections.reverse(questions)
를 이용하여 questions을 보냈는데 그렇게 되면 보낼 때마다 reverse하기 때문에 한번은 오름차순, 다음은 내림차순 이런식으로 왔다리 갔다리 하더라구요. 그래서 다음과 같은 방법으로 해결하여 역순으로 전달할 수 있었습니다. 주의할 점은 List 객체의 '얕은 복사', '깊은 복사'인데요. questions을 바로 =으로 받으면 얕은 복사가 이루어진다는 점을 기억해야 합니다.
Comparator<Question> comp = (q1, q2) -> -1;
List sortedQuestions = questions.stream()
.sorted(comp.reversed())
.collect(Collectors.toList());
또는 아래와 같이 해결할 수 있습니다.
List<Question> sortedQuestions = new ArrayList();
sortedQuestions.addAll(questions);
Collections.reverse(sortedQuestions);
기본 Java 자료형의 경우 clone()
메서드가 제공되는데 Question
과 같이 사용자 정의 자료형의 경우 clone()
메서드가 없어서 위와 같은 방법을 사용해야 했습니다. 또 다른 방법들은 링크(Clone a List in Java)를 참고해주세요.
input 태그없이 값 전달하기
그렇게 하기 위해선 input 태그를 숨기면 됩니다. <input type = "hidden" name = "topic" value = "something" />
를 사용하여 input태그가 보이지 않으면서도 값을 전달할 수 있었습니다.
singleton 패턴 적용해보기
싱글톤 패턴이 뭘까?
싱글톤 패턴은 static final
으로 인스턴스 변수를 미리 선언해 만들어두고 필요할 때마다 만들어둔 인스턴스 변수를 불러서 불필요한 인스턴스 변수를 만들어 메모리 낭비를 줄이는 방법입니다. 구글링을 통해 다음과 같은 싱글톤 패턴을 찾을 수 있었습니다.
class Something {
private Something() {}
private static class LazyHolder {
public static final List<Question> instance = new ArrayList<>();
}
public static List<Question> getInstance() {
return LazyHolder.instance;
}
}
해당 클래스의 안 LazyHolder라는 클래스를 만들고 그 안에 static final
속성을 가진 객체를 생성하는 것이죠. 그리고 필요할 때마다 getInstance()
를 불러서 그 객체를 활용하는 것입니다.
저의 경우 QuestionRepository
만들어두고 여기에서 객체를 꺼내어 사용했습니다. 그리고 static블록을 통해 테스트 데이터들도 같이 넣었습니다.
중복되는 html코드 개선
다음 html 부분에서 중복이 있었습니다.
<!DOCTYPE html>
<html lang="kr">
{{>common/head}}
<body>
{{>common/navBar}}
이것도 줄였다고 한 것이지만 이 부분을 사용하는 모든 html파일에서 똑같이 이 코드를 사용하기 때문에 이 또한 중복인 것이죠. 따라서 이 부분을 하나의 html로 만든다음 그 html파일을 {{>common/upperCommon}}
으로 불러와 개선시켰습니다.
오늘도 많은 것들을 배울 수 있는 하루였습니다. 내일은 또 새로운 지식들을 배울 수 있겠네요!
'TIL' 카테고리의 다른 글
Today's Dev Notes(2018-11-17) (0) | 2018.11.18 |
---|---|
Today's Dev Notes(2018-11-15) (0) | 2018.11.15 |
Today's Dev Notes(2018-11-13) (0) | 2018.11.14 |
Today's Dev Notes(2018-11-12) (0) | 2018.11.13 |
Today's Dev Notes(2018-11-04) (0) | 2018.11.04 |