๐จ ๋ฌธ์ ์ํฉ
๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค๊ฐ ๋ง๋ ์ด์์ ๋๋ค.
๊ธฐ์กด ์์ ๋ก๊ทธ์ธ ์๋ต๊ฐ์ ์๋์ ๊ฐ์์ต๋๋ค.
์์ ๋ก๊ทธ์ธ ํ, ํ์๊ฐ์ ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๋ฐ๊ธฐ ์ํด ์๋ก์ด ์ ์ ์ธ์ง ์ฌ๋ถ๋ฅผ `isNewMember` ํ๋๋ฅผ ํตํด ํ์ํด์ฃผ๊ณ ์์์ด์.
@Getter
@AllArgsConstructor
@NoArgsConstructor
public static class SignInResponse {
private boolean isNewMember;
private TokenInfo tokenInfo;
}
๊ทธ๋ฐ๋ฐ ์น ์ฐฝ์ผ๋ก ๋ก๊ทธ์ธ์ ์๋ฃํ ํ, ๋์จ ์๋ต๊ฐ์ ๋ณด๋ฉด 2๊ฐ์ง ๋ฌธ์ ์ ์ ๋ฐ๊ฒฌํ ์ ์์์ต๋๋ค.
{
"tokenInfo": {
...
},
"newMember": false,
}
(1) `isNewMember`๊ฐ `newMember`๋ก ๋ณ๊ฒฝ๋ ๊ฒ
(2) ํญ์ `newMember`์ ๊ฐ์ด `false`๋ก ๋์ค๋ ๊ฒ.
๋ ๋ฒ์งธ ๋ฌธ์ ๋ ๋ก์ง ๊ตฌํ์์์ ์ค๋ฅ์ผ ์ ์์ผ๋, ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋ก๊ทธ๋ฅผ ์ฐ์ด๋ดค์ต๋๋ค.
@Transactional
public SignInResponse signIn(SignInRequest request) {
...
log.info("isNewMember = {}", isNewMember);
return new SignInResponse(isNewMember, tokenInfo);
}
๋๋๊ฒ๋ ๋ก๊ทธ ๊ฒฐ๊ณผ๋ `true`๋ก ์ ๋์์ด์.
๊ทธ๋ผ ๋๋์ฒด ์ด๋๊ฐ ๋ฌธ์ ์ผ๊น์?
โ ์์ธ ๋ถ์
์์ธ์ ๋ฐ๋ก @Getter ๋๋ฌธ์ด์์ต๋๋ค. ์ ํํ๊ฒ ๋งํ๋ฉด, ์ด ๋ฌธ์ ๋ Lombok๊ณผ Jackson์ ํฉ์์ด์์ต๋๋ค.
Lombok์ JavaBeans ํ์ค์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์, JavaBeans์ ๊ท์น์ ๋ฐ๋ผ primitive ํ์ ์ธ boolean ๋ณ์์ ๋ํด getter ๋ฉ์๋์ ์ด๋ฆ์ด `is`๋ก ์์ํ๋ค๊ณ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ณ์๋ช
์ด `is`๋ก ์์ํ๋ ๊ฒฝ์ฐ๋ ์ด๋จ๊น์?
๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด boolean ํ๋๊ฐ `is`๋ก ์์ํ๊ณ ๊ทธ ๋ค์ ๋๋ฌธ์๊ฐ ๋ฐ๋ก ์ค๋ ๊ฒฝ์ฐ, ์ถ๊ฐ์ ์ธ ์ ๋์ฌ ์์ด ๊ทธ๋๋ก getter ๋ฉ์๋ ์ด๋ฆ์ด ์์ฑ๋ฉ๋๋ค.
์ฆ, `isNewMember` ๋ณ์์ ๋ํด getter ๋ฉ์๋๊ฐ `getIsNewMember()`๊ฐ ์๋, `isNewMember()`๋ก ์์ฑ๋๋ ๊ฒ์
๋๋ค.
"๊ทธ๋ ๋ค๋ฉด ์ฌ๊ธฐ์ ๋ณ์๋ช
์ด ์ `newMember`๋ก ์ธ์๋๋ ๊ฒ์ผ๊น์?"
์ด ์ด์ ๋ Spring์ Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ต๋๋ค.
Jackson์ JSON ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฒ๋ฆฌํด ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ๋ฐ, ์๊ฐ JSON ์ง๋ ฌํ์ ์ญ์ง๋ ฌํ ๊ณผ์ ์์ ํด๋์ค์ ํ๋ ์์ฒด๊ฐ ์๋ ๊ทธ ํ๋๋ฅผ ๋ํ๋ด๋ getter์ setter ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
๋ฐ๋ผ์ getter ๋ฉ์๋์ธ `isNewMember()`๋ฅผ ๋ฐ๋ผ ํ๋๋ฅผ ์ธ์ํ๋ค ๋ณด๋ `newMember`๋ผ๋ ํ๋๋ก ์ธ์๋ ๊ฒ์ ๋๋ค.
๐ท ํ๋ฆ ์ ๋ฆฌ
- Lombok์ @Getter ์ด๋ ธํ ์ด์ ์ `isNewMember` ํ๋์ ๋ํด `isNewMember()`๋ผ๋ getter ๋ฉ์๋๋ฅผ ์์ฑ
- Jackson์ ์ด getter ๋ฉ์๋๋ฅผ ๋ฐํ์ผ๋ก `newMember`๋ผ๋ ํ๋๋ฅผ ์ธ์
- ํ์ง๋ง newMember๋ผ๋ ํ๋์ ๊ฐ์ ์ฐพ์ ์ ์์๊ธฐ์ ๋ํดํธ ๊ฐ์ธ `false`๋ก ์ฒ๋ฆฌ
โ ํด๊ฒฐ ๊ณผ์
๋จผ์ getter๋ฅผ ์ง์ ์ ์ํด ๋ณด์์ต๋๋ค.
@AllArgsConstructor
@NoArgsConstructor
public static class SignInResponse {
private boolean isNewMember;
private TokenInfo tokenInfo;
public boolean getIsNewMember() {
return isNewMember;
}
public TokenInfo getTokenInfo() {
return tokenInfo;
}
๊ฒฐ๊ณผ๊ฐ ์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค!
Getter ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ฉด์ ํด๊ฒฐํ ์ ์์๊น์?
๊ทธ๋์ primitive ํ์
์ธ `boolean`์ wrapper ํ์
์ธ `Boolean`์ผ๋ก ๋ณ๊ฒฝํด ๋ณด์์ต๋๋ค.
@Getter
@AllArgsConstructor
@NoArgsConstructor
public static class SignInResponse {
private Boolean isNewMember;
private TokenInfo tokenInfo;
}
์ด ๋ฐฉ์๋ ๊ฒฐ๊ณผ๊ฐ ์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค!
๊ทธ ์ด์ ๋ ๊ณต์๋ฌธ์์ ๊ฐ๋ฉด ํ์ธํ ์ ์์ต๋๋ค.
boolean ํ์ ์ is ์ ๋์ฌ๊ฐ ๋ถ์ง๋ง, Boolean๊ณผ ๊ฐ์ ๊ฐ์ฒด ํ์ ์ is ๋์ get ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง Boolean ํ๋๊ฐ์ด null์ผ ์ ์๋ค๋ ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
๋ค์์ผ๋ก ๋จ์ํ๊ฒ ํ๋๋ช ์ `is` ์ ๋์ฌ๊ฐ ์๊ฒ ๋ณ๊ฒฝํ์ต๋๋ค.
@Getter
@AllArgsConstructor
@NoArgsConstructor
public static class SignInResponse {
private boolean newMember;
private TokenInfo tokenInfo;
}
์ ํด๊ฒฐ๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด, ์ด๋ฐ ์ค์ ์ ๋ณด์ค ์ ์์ต๋๋ค.
lombok.getter.noIsPrefix ๊ฐ์ true๋ก ์ค์ ํ๋ฉด boolean ๋ณ์์ ๋ํด getter๋ฅผ ์์ฑํ ๋, `get`์ผ๋ก ์์ํ๋๋ก ํจ์ ์ด๋ฆ์ ์ง๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ๋ ํ๋์ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ๋ ์ ์๊ฒ ๋ค์.
โ ํด๊ฒฐ ๋ฐฉ์ ์ ๋ฆฌ
์ ๋ฆฌํ์๋ฉด, ํด๊ฒฐ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(1) Getter ์ง์ ์ ์ํ๊ธฐ
(2) boolean ๋์ Boolean ์ฐ๊ธฐ
(3) ๋ณ์๋ช is ์ ๋์ฌ ์์ ๊ธฐ
(4) lombok.getter.noIsPrefix = true๋ก ์ค์ ํ๊ธฐ
์ ๋ ์ต์ข ์ ์ผ๋ก is ์ ๋์ฌ๋ฅผ ์์ ๋ ๋ฐฉ์์ ํํ์ต๋๋ค.
'๐ฏ Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] ์ค๋ณต ์ ๊ฑฐ ๋ฐฉ๋ฒ(+์ ๋ ฌ) (1) | 2025.01.31 |
---|---|
[Github Action] build ์ค๋ฅ ์์ธ ๋ ์์ธํ ๋ณด๋ ๋ฒ (0) | 2024.10.08 |
์ธํฐํ์ด์ค(Interface) vs ์ถ์ ํด๋์ค(Abstract class) (0) | 2024.05.25 |
SOLID ์์น (1) | 2024.04.07 |