๐๏ธ 2024 ๋ฒํด๋ฆฌ์ฆ Java SpringBoot ์ธํฐ๋ทฐ ์ง๋ฌธ (1)
HashMap์ ๋ด๋ถ์์ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ? * Java HashMap์ null ํค์ null ๊ฐ์ ํ์ฉํฉ๋๋ค. * HashMap์ ์์๊ฐ ์ง์ ๋ ์ปฌ๋ ์ ์ด ์๋๋๋ค. ํค ์งํฉ์ ํตํด HashMap์ ๋ฐ๋ณตํ ์๋ ์์ง๋ง, HashMap์ ์ถ๊ฐ๋๋ ์์๋ฅผ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค. * HashMap์ ๋น๋๊ธฐํ๋๊ณ null ๊ฐ์ ํ์ฉํ๋ค๋ ์ ์ ์ ์ธํ๋ฉด Hashtable๊ณผ ๊ฑฐ์ ์ ์ฌํฉ๋๋ค. * HashMap์ ๋งต ์ํธ๋ฆฌ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ด๋ถ ํด๋์ค์ธ Node๋ฅผ ์ฌ์ฉํฉ๋๋ค. * HashMap์ ๋ฒํท ๋๋ ๋น(bin)์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ ์ฑ๊ธ ๋งํฌ๋ ๋ฆฌ์คํธ์ ํญ๋ชฉ์ ์ ์ฅํฉ๋๋ค. ๊ธฐ๋ณธ ๋น ์๋ 16๊ฐ์ด๊ณ ํญ์ 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ ๋๋ค. * HashMap์ get ๋ฐ put ์ฐ์ฐ์ ์ํด hashCode() ๋ฐ equals() ๋ฉ์๋๋ฅผ ํค์ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ HashMap ํค ๊ฐ์ฒด๋ ์ด๋ฌํ ๋ฉ์๋๋ฅผ ์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด String๊ณผ Integer๊ณผ ๊ฐ์ ๋ถ๋ณ ํด๋์ค๊ฐ ํค์ ๋ ์ ํฉํ ์ด์ ์ ๋๋ค. * Java HashMap์ thread safeํ์ง ์์ต๋๋ค. ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์ ๊ฒฝ์ฐ ConcurrentHashMap ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ Collections.synchronizedMap() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ย HTTP ์์ฒญ ๋ฉ์๋ ์ฐจ์ด - Get vs Put vs Post? Java ์ธํฐ๋ทฐ์์๋ ํญ์ put vs post์ ๊ฐ์ HTTP ๋ฉ์๋ ์ง๋ฌธ์ ํฉ๋๋ค.ย ย ๋ฏธ๋ฆฌ ์ ์๋ ๋ฉ์๋๋ฅผ ํ์ฉํ์ง ์๊ณ ๋ฌธ์์ด ๋ฐฐ์ด์ reverse ํด๋ณด์ธ์ย ๋ฉด์ ๊ด๋ค์ Java API๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋์ง ์๊ณ ์ถ์ดํฉ๋๋ค.ย public class ReverseArrayWithoutPredefinedMethod { public static void main(String[] args) { // Sample array of strings String[] array = {"apple", "banana", "orange", "grape"}; // Printing original array System.out.println("Original array:"); printArray(array); // Reversing the array reverseArray(array); // Printing reversed array System.out.println("\nReversed array:"); printArray(array); } // Method to reverse the array of strings public static void reverseArray(String[] arr) { int start = 0; int end = arr.length - 1; // Swap elements from start to end until mid is reached while (start < end) { // Swapping elements String temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; // Moving pointers towards the center start++; end--; } } // Method to print the array of strings public static void printArray(String[] arr) { for (String s : arr) { System.out.print(s + " "); } System.out.println(); } } ย comparable๊ณผ comparator์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์? Java์์ Comparable๊ณผ Comparator์ ๊ฐ์ฅ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด์ ์ ์ง์ํ๋ ์ ๋ ฌ ์ํ์ค์ ์์ด๋ค: * Comparable: ๋จ์ผ ์ ๋ ฌ ์์๋ฅผ ์ง์ํฉ๋๋ค.ย * Comparator: ์ฌ์ฉ์ ์ง์ ์ ๋ค๋ผ ์ฌ๋ฌ ์ ๋ ฌ ์ํ์ค๋ฅผ ์ ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.ย [Comparable] * ํด๋์ค์ ๊ฐ์ฒด์ ๋ํ ์์ฐ์ค๋ฌ์ด ์์๋ฅผ ์ ์ํฉ๋๋ค. * ํด๋์ค ์์ฒด์์ compareTo(Object o) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํฉ๋๋ค. * ์ด ๋ฉ์๋๋ ํ์ฌ ๊ฐ์ฒด๊ฐ ์ธ์(o)๋ณด๋ค ์์ผ๋ฉด ์์, ๊ฐ์ผ๋ฉด 0, ํ์ฌ ๊ฐ์ฒด๊ฐ ๋ ํฌ๋ฉด ์์๋ฅผ ๋ฐํํฉ๋๋ค. * ํด๋์ค์ ๋จ์ผ ์ธก๋ฉด์ ๊ธฐ์ค์ผ๋ก ํ ์ ๋ ฌ๋ง ์ ๊ณตํฉ๋๋ค. [Comparator] * ๊ฐ์ฒด์ ๋ํ ์ ๋ ฌ ๋ก์ง์ ์ ์ํ๋ ๋ณ๋์ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. * ๋ณ๋์ ํด๋์ค ๋๋ ์ต๋ช ์ ๋ด๋ถ ํด๋์ค๋ก ๊ตฌํ๋ฉ๋๋ค. * compare(Object o1, Object o2) ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๊ณ ์ฒซ ๋ฒ์งธ ๊ฐ์ฒด๊ฐ ๋ ๋ฒ์งธ ๊ฐ์ฒด๋ณด๋ค ์์ผ๋ฉด ์์, ๊ฐ์ผ๋ฉด 0, ํฌ๋ฉด ์์๋ฅผ ๋ฐํํฉ๋๋ค. * ๋ค์ํ ๊ฐ์ฒด ํน์ฑ์ ๋ฐ๋ผ ์ปค์คํ ํ ์ ๋ ฌ ๊ธฐ์ค์ ์ ์ํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ย jdbctemplate, statement, preparedstatement, callable statement๋ ๋ฌด์์ธ๊ฐ์? JDBC(Java Database Connectivity)๋ Java์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.ย [JdbcTemplate] * JdbcTemplate์ JDBC API์ ์์ ์ ๋จ์ํ ํ๋ ํด๋์ค์ ๋๋ค. * ์ปค๋ฅ์ , statement ์์ฑ ๋ฐ ์์ธ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ถ์ํํฉ๋๋ค. * prepared statements ์ ๋งค๊ฐ ๋ณ์ ๋ฐ์ธ๋ฉ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ SQL ์ฟผ๋ฆฌ ๋ฐ ์ ๋ฐ์ดํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค. [Statement] * Satement ์ธํฐํ์ด์ค๋ SQL ๋ฌธ์ ์คํํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค. * Connection ๊ฐ์ฒด์์ Statement ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. * SELECT, INSERT, UPDATE, DELETE ๋ฑ์ ๋ค์ํ SQL ๋ฌธ์ ์คํํ ์ ์์ต๋๋ค. * ๊ทธ๋ฌ๋, Statement ๋ ์ ํ์ฌํญ์ด ์์ต๋๋ค. * SQL ๋ฌธ์์ด์์ ์ง์ ๋งค๊ฐ ๋ณ์๋ฅผ ํ์ฉํ์ง ์์ผ๋ฏ๋ก, SQL ์ฃผ์ ๊ณต๊ฒฉ์ ์ทจ์ฝํฉ๋๋ค. * ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ก ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณต ์คํํ๋ ๊ฒฝ์ฐ ํจ์จ์ฑ์ด ๋จ์ด์ง๋๋ค. [PreparedStatement] * PreparedStatement๋ ์์์ ์ธ๊ธํ ํ๊ณ๋ฅผ ํด๊ฒฐํ๋ Statement์ ํ์ฅ์ ๋๋ค. * ๋งค๊ฐ ๋ณ์('?')์ ๋ํ ์๋ฆฌ ํ์์๊ฐ ์๋ ์ฌ์ ์ปดํ์ผ๋ SQL ํ ํ๋ฆฟ์ ์ ๊ณตํ์ฌ PreparedStatement ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. * ๊ทธ๋ฐ ๋ค์ setter ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ์ด๋ฌํ ๋งค๊ฐ ๋ณ์์ ๋ํ ๊ฐ์ ์ค์ ํฉ๋๋ค. * ์ด๋ ๊ฒ ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๋ฉด ๋ณด์์ด ํฅ์๋๊ณ (SQL ์ฃผ์ ๋ฐฉ์ง) ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค. (๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ค์ ์ปดํ์ผํ๋ ๊ฒ์ ๋ฐฉ์ง) [CallableStatement] * CallableStatement๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ํ๋ก์์ ๋ฅผ ํธ์ถํ๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋ Statement์ ํ์ฅ์ ๋๋ค. * ์ ์ฅ๋ ํ๋ก์์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฏธ๋ฆฌ ์์ฑ๋ SQL ์ฝ๋ ๋ธ๋ก์ผ๋ก, ์ด ๋ธ๋ก์ ์คํํ ์ ์์ผ๋ฉฐ ์ ์ฌ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์์ต๋๋ค. * CallableStatement๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฅ๋ ํ๋ก์์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ํ๊ณ ํธ์ถ์ ์คํํ ์ ์์ต๋๋ค. ย @Component์ @Autowired ์ด๋ ธํ ์ด์ ์ด๋ ๋ฌด์์ธ๊ฐ์? ์ด๋ ธํ ์ด์ ์ ์์กด์ฑ ์ฃผ์ ๋ฐ ๊ด๋ฆฌ๋ฅผ ์ํ ์คํ๋ง ํ๋ ์์ํฌ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋๋ค. ย [@Component] * Spring bean์ ์คํ ๋ ์คํ์ ์ด๋ ธํ ์ด์ ์ ๋๋ค. * Spring์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ํ๋ ๋์ @Component ์ด๋ ธํ ์ด์ ์ด ๋ฌ๋ฆฐ ํด๋์ค๋ฅผ ๊ฒ์ํฉ๋๋ค. * ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ ํด๋์ค๋ Spring container์ ์ํด ๊ด๋ฆฌ๋๋ฉฐ, ์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค: * ๊ทธ๋ค์ ์ธ์คํด์คํ ํฉ๋๋ค. * ํ์ํ ์ข ์์ฑ์ ์ฃผ์ ํฉ๋๋ค. * ๋ค๋ฅธ bean์ ์๋ ์ฃผ์ ํฉ๋๋ค. [@Autowired] * Spring์ด ๊ด๋ฆฌํ๋ ๋น์ ์ข ์์ฑ์ ์ฃผ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. * @Autowired๋ก ํ๋, ์ธํฐ ๋ฉ์๋ ๋๋ ์์ฑ์ ์ธ์์ ํ์ํ ์ ์์ต๋๋ค. * Spring์ ์๋์ผ๋ก ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ์์ ํธํ๋๋ ๋น์ ์ฐพ์ ์ฃผ์ ํฉ๋๋ค. * ์ด๋ฅผ ํตํด ์์กด์ฑ ์ฃผ์ ์ ๋จ์ํํฉ๋๋ค. [@Compoent์ @Autowired์ ๊ด๊ณ] * @Component๋ ํด๋์ค์ ๋น์ ๋งํฌํฉ๋๋ค. * @Autowired๋ ์ด ๋น์ ์์กด์ฑ์ ์ฃผ์ ํฉ๋๋ค. [์ฆ,] * @Component: "์ด ํด๋์ค๋ Spring์ด ๊ด๋ฆฌํด์ผ ํ๋ ๋น์ด์ผ." * @Autowired: "Spring, ์ฌ๊ธฐ์ ํธํ๋๋ ๋น์ ์ฃผ์ ํด์ค." [์ถ๊ฐ ํฌ์ธํธ] * ๊ธฐ๋ณธ์ ์ผ๋ก, Spring์ main ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค๊ฐ ์์นํ ํจํค์ง๋ฅผ ์ค์บํฉ๋๋ค. ์ด ์์ ์ @ComponentScan ์ด๋ ธํ ์ด์ ์ ์ด์ฉํด ์ค์ ํ ์ ์์ต๋๋ค. * ๋์ผํ ์ ํ์ ๋น์ด ์ฌ๋ฌ๊ฐ ์๋ ๊ฒฝ์ฐ, Qualifier๋ฅผ ์ด์ฉํ์ฌ ์ ์ ํ ๋น์ ์ฃผ์ ์ํฌ ์ ์์ต๋๋ค. ย SQL Injection์ด๋ ๋ฌด์์ธ๊ฐ์? SQL ์ฃผ์ ์ ์น ๋ณด์ ์ทจ์ฝ์ฑ์ ๋๋ค. ๊ณต๊ฒฉ์๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ํ์น๊ฑฐ๋ ์์ ํ๊ฑฐ๋ ์ฌ์ง์ด๋ ์ญ์ ๊น์ง ํ ์ ์์ต๋๋ค. ย SQL ์ฃผ์ ์ ๋ฐฉ์งํ๋ ค๋ฉด ๋ค์ ๋ณด์ ์กฐ์น๋ฅผ ๋ฐ๋ผ์ผ ํฉ๋๋ค. * ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ์ ๊ฒ์ฆํฉ๋๋ค. * prepared statements๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ค์ SQL ์ฟผ๋ฆฌ์ ๋ถ๋ฆฌํฉ๋๋ค. * ๋ณต์กํ ์ฟผ๋ฆฌ์๋ stored procedures ์ฌ์ฉ์ ๊ณ ๋ คํฉ๋๋ค. * ์ต์ ๋ณด์ ํจ์น๋ก ์ํํธ์จ์ด๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ย Hibernate์ sessionfactory์ session์ ๋ฌด์์ธ๊ฐ์? Java์ฉ ORM(object-relational mapper) ํ๋ ์์ํฌ์ธ Hibernate์์ Session ๋ฐ SessionFactory๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ย [SessionFactory] * Session ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ํฉํ ๋ฆฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์์ฉ ํ๋ก๊ทธ๋จ๋น ํ๋์ SessionFactory๊ฐ ์์ต๋๋ค. * ์๋ฐ ํด๋์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด ๋ฐ ๋งคํ๊ณผ ๊ฐ์ hibernate ๊ตฌ์ฑ ์ธ๋ถ ์ ๋ณด๋ฅผ ์บก์ํํฉ๋๋ค. * SessionFactory๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ํ๋ ๋์ ์์ฑ๋๋ฉฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ์๋ช ์ฃผ๊ธฐ ๋์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. * ํจ์จ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ ์ํด connection pooling์ ์ฌ์ฉํฉ๋๋ค. * ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ฐ ๋งคํ์ ๋ํ ์ ๋ณด๋ฅผ ์บ์ํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. [Session] * ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋จ์ผ ํธ๋์ญ์ ์ ๋ํ๋ ๋๋ค. Session์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ๋ํ CRUD ์์ ์ ์ํํ ์ ์์ต๋๋ค. * Session์ ์ผ๋ฐ์ ์ผ๋ก ์์ฑ๋๊ณ ํน์ ์์ ์ ์ฌ์ฉ๋ ๋ค์ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๊ธฐ ์ํ์ฌ ๋ซํ๋๋ค. thread-safeํ์ง ์์ผ๋ฉฐ ์ค๋ ๋ ๊ฐ์ ๊ณต์ ๋์ด์๋ ์๋ฉ๋๋ค. * persistent ๊ฐ์ฒด๋ฅผ ์ ์ฅ, ์ ๋ฐ์ดํธ ๋ฐ ์ญ์ ํฉ๋๋ค. * ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํฉ๋๋ค. * ํธ๋์ญ์ ์ ๊ด๋ฆฌํฉ๋๋ค. * Session ๋ด์์ ์ต๊ทผ์ ์ ๊ทผํ ๊ฐ์ฒด์ ์์ ์บ์๋ฅผ ์ ์งํ์ฌ ๋ฐ๋ณต ์์ ์ ์ํ ์ฑ๋ฅ์ ํฅ์ํฉ๋๋ค. ย HQL์ด๋ ๋ฌด์์ธ๊ฐ์? HQL์ Hibernate Query Language์ ์ฝ์์ ๋๋ค. ๊ฐ๋จํ ๋งํด, Java์์ ์ธ๊ธฐ ์๋ ORM ํ๋ ์์ํฌ์ธ Hibernate๋ฅผ ์ํด ์ค๊ณ๋ ํน๋ณํ ์ฟผ๋ฆฌ ์ธ์ด์ ๋๋ค. * ๊ฐ์ฒด์ ์ง์ค: HQL์ ์ฌ์ฉํ๋ฉด ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ์ด ๋์ Java ํด๋์ค์ ์ด๋ฆ๊ณผ ์์ฑ์ ์ด์ฉํด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์์ SQL์ ์์ฑํ๋ ๊ฒ์ ๋นํด ์ฝ๊ธฐ ์ฝ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ญ๋๋ค. * HQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด Hibernate๊ฐ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํด๋นํ๋ SQL ๋ฌธ์ผ๋ก ๋ณํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์์ ์ธ์ด์ ๋ํ ๊ฑฑ์ ์์ ๋ฒ์ด๋ ์ ์์ต๋๋ค. ๋ฒ์ญ: [https://ducktopia.tistory.com/117] ์๋ฌธ: