티스토리 뷰

과제

  1. lastName이 아닌 FirstName으로 Owner를 찾아라.
  2. 정확히 일치하는 게 아니라 해당 키워드로 검색할 수 있게 하라.
  3. Owner에 나이(age)를 추가하라.

과제 1 : lastName이 아닌 FirstName으로 Owner를 찾아라.

  1. 템플릿에서 lastName을 firstName으로 수정해보자.

    • path : resources/templates/findOwners.html
    • path에서 label과 input에서 lastName을 firstName으로 바꿔주자.
      <form th:object="${owner}" th:action="@{/owners}" method="get"
      class="form-horizontal" id="search-owner-form">
      <div class="form-group">
      <div class="control-group" id="lastNameGroup">
        <label class="col-sm-2 control-label">First name </label>
        <div class="col-sm-10">
          <input class="form-control" th:field="*{firstName}" size="30"
            maxlength="80" /> <span class="help-inline"><div
              th:if="${#fields.hasAnyErrors()}">
              <p th:each="err : ${#fields.allErrors()}" th:text="${err}">Error</p>
            </div></span>
        </div>
      </div>
      </div>
      <div class="form-group">
      <div class="col-sm-offset-2 col-sm-10">
        <button type="submit" class="btn btn-default">Find
          Owner</button>
      </div>
      </div>
      
    ```
  2. OwnerRepository를 수정해보자.

    • path : owner/OwnerRepository
    • path에서 45 ~ 47줄을 다음과 같이 수정하자.
    @Query("SELECT DISTINCT owner FROM Owner owner left join fetch owner.pets WHERE owner.firstName LIKE :firstName%")
    @Transactional(readOnly = true)
    Collection<Owner> findByLastName(@Param("firstName") String firstName);
- lastName을 firstName으로 바꿔주면 해결된다.
  1. OwnerContorller를 수정해보자.
    • path : owner/OwnerController
    • path에서 82 ~ 107줄을 다음과 같이 수정하자.
@GetMapping("/owners")
    public String processFindForm(Owner owner, BindingResult result, Map<String, Object> model) {

        // allow parameterless GET request for /owners to return all records
        if (owner.getFirstName() == null) {
            owner.setFirstName(""); // empty string signifies broadest possible search
        }

        // find owners by last name
        Collection<Owner> results = this.owners.findByLastName(owner.getFirstName());
        if (results.isEmpty()) {
            // no owners found
            result.rejectValue("firstname", "notFound", "not found");
            return "owners/findOwners";
        }
        else if (results.size() == 1) {
            // 1 owner found
            owner = results.iterator().next();
            return "redirect:/owners/" + owner.getId();
        }
        else {
            // multiple owners found
            model.put("selections", results);
            return "owners/ownersList";
        }
    }
  • 과제 1번은 lastName을 firstName으로 바꿔주기만 하면 되는 쉬운 문제였다!

    주의사항

  • lastName을 firstName으로 바꿔줄 때 lastName이 변수로 사용됐을 때에만 firstName으로 바꿔주었다.
    • 왜 why? 메서드명도 바꿔주면 코드가 복잡해지고 어려워져서 변수만 바꿔주었다.

과제 2 : 정확히 일치하는 게 아니라 해당 키워드로 검색할 수 있게 하라.

  • 과제 1에서 수정해주었던 OwnerRepository에서 Query를 재수정해주어야 한다.
@Query("SELECT DISTINCT owner FROM Owner owner left join fetch owner.pets WHERE owner.firstName LIKE %:firstName%")
  • 앞에 %를 추가해주기만 하면 된다.

    주의사항

  • Query에서 :%firstName%이 아닌 %:firstName% 으로 해주어야 한다.
    • 왜 why? 콜론(:)까지 포함해서 변수이기 때문에 %:firstName% 으로 Query를 작성해야 한다.

과제 3 : Owner에 나이(age)를 추가하라.

  • 수정해야 할 부분이 굉장히 많은 과제였다!
  1. Person에서 age field를 추가해주자.
    • path : model/Person
    • path에서 다음 코드를 추가해주자.
    @Column(name = "age")
    private int age;

  public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
  1. Owner에서 toString를 수정해주자.
    • path : owner/Owner
    • path에서142 ~ 148줄을 수정해주자.
    @Override
    public String toString() {
        return new ToStringCreator(this)

                .append("id", this.getId()).append("new", this.isNew()).append("lastName", this.getLastName())
                .append("firstName", this.getFirstName()).append("age", this.getAge()).append("address", this.address).append("city", this.city)
                .append("telephone", this.telephone).toString();
    }
  1. schema를 수정해보자!
    • path : resources/db/hsqldb/schema.sql
    • owners를 CREATE하는 sql문을 수정해야한다.
    • INTEGER형 age를 추가해주자.
CREATE TABLE owners (
  id         INTEGER IDENTITY PRIMARY KEY,
  first_name VARCHAR(30),
  last_name  VARCHAR_IGNORECASE(30),
  age INTEGER,
  address    VARCHAR(255),
  city       VARCHAR(80),
  telephone  VARCHAR(20)
);
  1. default로 들어가는 data들을 수정해보자!
    • path : resources/db/hsqldb/data.sql
    • INSERT owners에 나이를 추가해서 수정하자.
    • (ex) INSERT INTO owners VALUES (1, 'George', 'Franklin', 20, '110 W. Liberty St.', 'Madison', '6085551023');

배운 점

  • 답을 먼저 보기보다는 주먹구구식으로 해결해보려고 노력했다.
  • 그 덕분에 로그 보는 방법이나 어딜 수정해야 하는지 감이 잡혔다!

참고

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함