2023. 3. 15. 13:52ใJAVA/Effective JAVA
item26. ๋ก ํ์ ์ ์ฌ์ฉํ์ง ๋ง๋ผ.
Generic Dao ๋ง๋ค๊ธฐ
Generic์ ํ์ฉํ๋ฉด ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ ์ ์๋ค๋ ์ฅ์ ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์ ๊ฐ์์๊ฐ์ ๊ฐ๋จํ Repository๋ฅผ ๋ง๋ค์๋ค.
public interface Entity {
Long getId();
}
public class Account implements Entity {
private Long id;
private String username;
public Account(Long id, String username) {
this.id = id;
this.username = username;
}
@Override
public Long getId() {
return this.id;
}
public String getUsername() {
return username;
}
}
public class Message implements Entity{
private Long id;
private String body;
@Override
public Long getId() {
return id;
}
public String getBody() {
return body;
}
}
๊ฐ๊ฐ Entity๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด๊ฐ ์๊ณ ,
public class AccountRepository {
private Set<Account> accounts;
public AccountRepository() {
this.accounts = new HashSet<>();
}
public Optional<Account> findById(Long id) {
return accounts.stream().filter(a -> a.getId().equals(id)).findAny();
}
public void add(Account account) {
this.accounts.add(account);
}
}
public class MessageRepository {
Set<Message> messages;
public MessageRepository() {
this.messages = new HashSet<>();
}
public Optional<Message> findById(Long id) {
return messages.stream().filter(a -> a.getId().equals(id)).findAny();
}
public void add(Message message) {
this.messages.add(message);
}
}
๊ฐ์ฒด๋ง๋ค ๊ฐ๊ฐ Repository๊ฐ ์๋ค๊ณ ๋ณด๋ฉด ์ง๊ธ Repository์ ์ฝ๋๊ฐ ๊ฐ์ฒด๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋นผ๊ณ ๋ ์์ ๋์ผํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ฐ ์ค๋ณต ์ฝ๋๋ฅผ Generic์ ํ์ฉํ๋ฉด ์ ๊ฑฐํ ์ ์๋ค.
public class GenericRepository<E extends Entity> {
private Set<E> entities;
public GenericRepository() {
this.entities = new HashSet<>();
}
public Optional<E> findById(Long id) {
return entities.stream().filter(a -> a.getId().equals(id)).findAny();
}
public void add(E e) {
entities.add(e);
}
}
E์ ํ์ ์ Entity๋ฅผ ์์๋ฐ์ ๊ฐ์ฒด๋ก ํ์ ํ๊ณ , ์ด๋ฐ์์ผ๋ก ๋ง๋ค์ด์ฃผ๋ฉด ์ค๋ณต ์ฝ๋๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ ์ ์๋ค.
public class AccountRepository extends GenericRepository<Account>{
// private Set<Account> accounts;
//
// public AccountRepository() {
// this.accounts = new HashSet<>();
// }
//
// public Optional<Account> findById(Long id) {
// return accounts.stream().filter(a -> a.getId().equals(id)).findAny();
// }
//
// public void add(Account account) {
// this.accounts.add(account);
// }
}
๊ทธ๋ฌ๋ฉด AccountRepository์ ์๋ ์ฝ๋๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ๊ณ GenericRepository๋ฅผ ์์๋ฐ๊ธฐ๋ง ํ๋ฉด ๋๋ค!
@Test
void findById() {
AccountRepository accountRepository = new AccountRepository();
Account account = new Account(1L, "whiteShip");
accountRepository.add(account);
Optional<Account> byId = accountRepository.findById(1L);
Assertions.assertTrue(byId.isPresent());
}
์ด ํ ์คํธ๋ฅผ ์ ๋ค๋ฆญ ์ฌ์ฉํ๊ธฐ ์ ์๋ ๋๋ ค๋ณด๊ณ , ์ ๋ค๋ฆญ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์๋ฐ์ ํ์๋ ๋๋ ค๋ณด๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋์ผํ๊ฒ ๋ํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
โ๏ธ ์ ๋ฆฌ
Generic ํ์ ์ ๊ณต๋ถํ๊ณ ํญ์ ๋ด๊ฐ ์ง์ ๋ง๋ค์ด์ ์ฌ์ฉํด๋ณธ ์ ์ ๊ฑฐ์ ๋๋ฌธ?๊ฒ ๊ฐ์๋ฐ ์ด๋ฒ ๊ฐ์ ์๊ฐ์ ํตํด์ ์ด๋ป๊ฒ ํ์ฉํ๋ฉด ๋๋์ง์ ๋ํด์ ๋ฐฐ์ ๋ค.
์ด๋ ๊ฒ ๋น์ทํ ์ฝ๋๊ฐ ๋ด๊ฐ ํ๋ ํ๋ก์ ํธ์๋ ๋ง์๋ฐ ์ด๊ฑด ๋น์ฅ ์ ์ฉํด๋ณด๊ณ ์ถ๋ค!!
์ ๋ค๋ฆญ์ ํ์ฉํ๋ฉด ์์ผ๋ก ์ํฐํฐ๊ฐ ํ๋ ๋ ์ถ๊ฐ๋๋ค๊ณ ํด์ ๋๊ฐ์ ์ฝ๋๋ฅผ ๋ ์์ฑํ์ง ์์๋ ๋๊ณ ๊ทธ๋ฅ extends GenericRepository<>๋ฅผ ํด์ฃผ๋ฉด ๋๋๊น ํจ์ฌ ํธ๋ฆฌํด์ง๋ ๊ฒ ๊ฐ๋ค ใ ใ