์ „์ฒด ๊ธ€ 77

[Java] List๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

๐Ÿ“Œ๋ฌธ์ œ2์ฐจ์› ๋ฐฐ์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ–‰์˜ ์›ํ™œํ•œ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด `List`๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค.   ๐Ÿ“Œํ•ด๊ฒฐ1. ๋ฐฐ์—ด์„ ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ๊ฐ€์ง„ `List`๋ฅผ ๋งŒ๋“ ๋‹ค.2. `List`๋ฅผ ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ๊ฐ€์ง„ `List`๋ฅผ ๋งŒ๋“ ๋‹ค.  ๐Ÿ“Œ๊ตฌํ˜„1. ๋ฐฐ์—ด์„ ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ๊ฐ€์ง„ `List`๋ฅผ ๋งŒ๋“ ๋‹ค. int[][] intArr = new int[][]{ {0, 0}, {0, 1}, {0, 2} };List list = new ArrayList(Arrays.asList(intArr));for (int[] ints : list) { System.out.println(Arrays.toString(ints));}// [0, 0]// [..

Java 2024.06.12

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํž™ ์ •๋ ฌ(Heap Sort)

๐Ÿ“Œํž™์ด๋ž€?'๋ถ€๋ชจ ๋…ธ๋“œ(๊ฐ’)๊ฐ€ ์ž์‹ ๋…ธ๋“œ(๊ฐ’)๋ณด๋‹ค ํ•ญ์ƒ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋‹ค'๋ผ๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ. ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ํž™์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์ตœ๋Œ“๊ฐ’์€ ํ•ญ์ƒ ๋ฃจํŠธ ๋…ธ๋“œ์— ์œ„์น˜ํ•˜๊ฒŒ ๋˜๋ฉฐ(๋‹จ, ๊ฐ™์€ ๋ถ€๋ชจ๋ฅผ ๊ณต์œ ํ•˜๋Š” ํ˜•์ œ ๋…ธ๋“œ์˜ ๋Œ€์†Œ ๊ด€๊ณ„๋Š” ์ผ์ •ํ•˜์ง€ ์•Š๋‹ค. -> ์™ผ์ชฝ์ด ์˜ค๋ฅธ์ชฝ๋ณด๋‹ค ํด ์ˆ˜๋„ ์žˆ์Œ.), ๋ฃจํŠธ ๋…ธ๋“œ์— ์ตœ๋Œ“๊ฐ’์„ ๊ฐ–๋Š” ํž™์„ '์ตœ๋Œ€ ํž™(maximum heap)' ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผํ•˜๋Š” ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ '์ตœ์†Œ ํž™(minimum heap)'์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ ๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ“Œํž™ ์ •๋ ฌ์ด๋ž€?์ž๋ฃŒ๊ตฌ์กฐ ํž™(Heap)์˜ ์žฅ์ ์„ ํ™œ์šฉํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜. ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ํž™์œผ๋กœ ๋งŒ๋“  ๋’ค ๊ฐ€์žฅ ํฐ ๊ฐ’์ธ ๋ฃจํŠธ๋ฅผ ๊บผ๋‚ด๊ณ , ๋ฃจํŠธ ์ด์™ธ์˜ ..

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ€ต ์ •๋ ฌ(Quick Sort)

๐Ÿ“Œํ€ต ์ •๋ ฌ์ด๋ž€?๊ฐ€์žฅ ๋น ๋ฅธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜. ๋ถ„ํ•  ์ •๋ณต ๋ฐฉ๋ฒ•์ด ์ ์šฉ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜. ์ฐฐ์Šค ์•คํ„ฐ๋‹ˆ ๋ฆฌ์ฒ˜๋“œ ํ˜ธ์–ด(C. A. R. Hoare)๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ •๋ ฌ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค๊ณ  ํ•ด์„œ ๋ถ™์ธ ์ด๋ฆ„์ด๋‹ค. ๋ฐฐ์—ด ๋‚ด์˜ ํŠน์ • ๋ฐ์ดํ„ฐ(pivot)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•  ๋ฐ์ดํ„ฐ๋“ค์„ ์™ผ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ํ€ต ์ •๋ ฌ์„ ์ˆœํ™˜์œผ๋กœ ์ ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ์ •๋ ฌํ•œ๋‹ค.  ๐Ÿ“Œ์‹œ๊ฐ„ ๋ณต์žก๋„์ตœ์•…: O(n^2) ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด์„ ์ •๋ ฌํ•  ๊ฒฝ์šฐ์ตœ์„ : O(n log n)ํ‰๊ท : O(n log n)  ๐Ÿ“Œํ๋ฆ„1. ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ n์ธ ๋ฐฐ์—ด `arr`๊ฐ€ ์žˆ์„ ๋•Œ `arr` ๋‚ด ์ž„์˜์˜ ๋ฐ์ดํ„ฐ ํ”ผ๋ฒ—(pivot)์„ ์ •ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ(`arr[0]`)๊ฐ€ ๋œ๋‹ค.2. ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ..

[Java] ๋ฌธ์ž(char)์™€ ๋ฌธ์ž์—ด(String)์„ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜

๐Ÿ“Œ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” String ํด๋ž˜์Šค์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฉ”์„œ๋“œ1. ๋ฌธ์ž ๋ฐฐ์—ด -> String2. ์ง€์ •๋œ ์ธ๋ฑ์Šค์˜ ๋ฌธ์ž ๋ฐ˜ํ™˜3. ์‚ฌ์ „์ˆœ ๋น„๊ต4. ๋ฌธ์ž์—ด์ด ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์‚ฌ5. ๊ฐ™์€์ง€ ๋น„๊ต6. ์ฃผ์–ด์ง„ ๋ฌธ์ž์˜ ์ธ๋ฑ์Šค7. ์ง€์ •๋œ ๋ฌธ์ž์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค8. ๋ฌธ์ž์—ด ๊ธธ์ด9. ๋ฌธ์ž์—ด ๊ต์ฒด(replace)10. ๋ถ„๋ฆฌ์ž๋กœ ๋‚˜๋ˆ„์–ด ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜11. ๋ถ€๋ถ„ ์ž๋ฅด๊ธฐ12. ์†Œ๋ฌธ์ž/๋Œ€๋ฌธ์ž ๋ณ€ํ™˜13. ๊ณต๋ฐฑ ์ œ๊ฑฐ14. ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜    1. ๋ฌธ์ž ๋ฐฐ์—ด์„ String์œผ๋กœ ๋ณ€ํ™˜`String(char[] value)`  char[] c = {'H', 'e', 'l', 'l', 'o'};String s = new String(c);// s = "Hello"   2. ์ง€์ •๋œ ์œ„์น˜(index)์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ ๋ฐ˜ํ™˜`char charAt(int ..

Java 2024.05.30

[React] To-do list ๋งŒ๋“ค๊ธฐ

๐Ÿ“Œํ™˜๊ฒฝMacVSCode  ๐Ÿ“Œ์ถ”๊ฐ€ํ•˜๊ธฐ`input`์— ํ• ์ผ์„ ์ž…๋ ฅํ•˜๊ณ  ์—”ํ„ฐ๋ฅผ ์ž…๋ ฅ(๋˜๋Š” ์ถ”๊ฐ€ ๋ฒ„ํŠผ ํด๋ฆญ)ํ• ์ผ ๋ชฉ๋ก์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค.  function App() { return ( ํ• ์ผ ๋ชฉ๋ก ์ถ”๊ฐ€ );}export default App; ๊ธฐ๋ณธ ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ `useState`์™€ `onChange` ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.  const [toDo, setTodo] = useState(""); const [todoList, setTodoList] = useState([]); function onChange(e) { setTodo(e.target.value); } // ... ..

React 2024.05.27

[React] ๊ธฐ์ดˆ

๐Ÿ“Œํ™˜๊ฒฝMacVSCode  ๐Ÿ“Œ๋ฆฌ์•กํŠธ๋ž€?์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ UI๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ ์กฐ๊ฐ์„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ •์˜ํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์žฌ๋žœ๋”๋งํ•˜์—ฌ ํšจ์œจ์„ ๋†’์ธ๋‹ค.  - Vanilla JS : HTML ํƒœ๊ทธ๋ฅผ ๋จผ์ € ๋งŒ๋“ค๊ณ  property๋ฅผ ์„ค์ •ํ•œ ๋’ค Javascript ์ฝ”๋“œ๋กœ ํ•ด๋‹น ํƒœ๊ทธ๋ฅผ ๋ณ€๊ฒฝํ•จ.- React.js : ์š”์†Œ(Element)๋ฅผ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ƒ์„ฑํ•œ ๋’ค HTML๋กœ ๋งŒ๋“ค์–ด์„œ ๋ Œ๋”๋งํ•จ. const span = ReactDOM.createElement( "span", // html ํƒœ๊ทธ {id : "id"}, // property "Hello, I'm span" // innerText); ์ด๋ ‡๊ฒŒ ์ง์ ‘ UI๋ฅผ ์ž‘์„ฑํ• ..

React 2024.05.14

[MySQL] ํ…Œ์ด๋ธ”์— csv ํŒŒ์ผ๋กœ import ์‹œ Unhandled exception: 'ascii' codec can't decode byte 0xeb in position 78: ordinal not in range(128) ์˜ค๋ฅ˜

open /Applications/MySQLWorkbench.app ์›Œํฌ๋ฒค์น˜๋ฅผ ๋‹ค ๋„๊ณ  ํ„ฐ๋ฏธ๋„๋กœ ์ผ  ๋‹ค์Œ import ํ•˜๋ฉด ์ž˜ ๋™์ž‘ํ•œ๋‹ค...   ๐Ÿ“Œ์ฐธ๊ณ  [MySQL/Error] unhandled exception: 'ascii' codec can't decode byte 0xe3 in position 63: ordinal not in range(128)csv ํŒŒ์ผ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋„ฃ์–ด์ฃผ๋ ค๊ณ ํ•˜๋Š”๋ฐ utf-8๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์—ˆ๋Š”๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž๊พธ ์œ„์™€๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ open /Applications/MySQLWorkbench.app ์ด์™€๊ฐ™์ด ํ„ฐ๋ฏธ๋„์—์„œ ์•ฑ์„ ์—ด๊ณ , ํ•ด์ฃผ์—ˆ๋”๋‹ˆ ์˜ค๋ฅ˜๊ฐ€ ํ•ดsuucong.tistory.com

[JavaScript] axios.get ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š์Œ

๐Ÿ“Œ๋ฌธ์ œ ์นดํ…Œ๊ณ ๋ฆฌ๋ช…์ด `์ž๋ฐ”`์ธ ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ `name: '์ž๋ฐ”'`๋ฅผ ์ „์†กํ–ˆ์œผ๋‚˜ ๋ฐฑ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ธ์‹๋˜์ง€ ๋ชปํ•˜๊ณ  null ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ. const param = { name : '์ž๋ฐ”' } getBoardList(param).then(result => { console.log(result); }).catch( e => { console.log(e); }); async function getBoardList(paramList){ const response = await axios.get('/board/list', paramList); return response.data; } @GetMapping("/list") @ResponseBody public List board..

JavaScript 2024.03.29

[JavaScript] url ํŒŒ๋ผ๋ฏธํ„ฐ ํ™œ์šฉํ•˜๊ธฐ

๐Ÿ“Œ๋ฌธ์ œ ๊ธฐ์กด์—๋Š” ์ œ์ถœ์ด ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์‹คํŒจํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ˆ๋‚ดํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด `Controller` ๋ฉ”์„œ๋“œ ๋‚ด์— `PrintWriter`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ `alert`๋ฅผ ๋„์šฐ๋„๋ก ํ–ˆ๋‹ค. response.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8"); PrintWriter w = null; try { w = response.getWriter(); } catch (IOException e) { // throw new RuntimeException(e); return "redirect:/another"; } if(result == 1){ w.println(""); w.close(); ๋ฌผ..

JavaScript 2024.03.29

[SpringBoot] ์ •์  ๋ฆฌ์†Œ์Šค์— ๊ถŒํ•œ ์š”๊ตฌํ•˜์ง€ ์•Š๊ธฐ

๐Ÿ“Œํ™˜๊ฒฝIntelliJ UltimateJava 17SpringBoot 3.2.3Gradle - Groovy Dependencies: Spring WebThymeleafSpring Data JPAlombokMariaDB 10.11Spring Dev toolSpring Security  ๐Ÿ“Œ๋ฌธ์ œ๋ชจ๋“  ์ •์  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด 403 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ์ด๋ฏธ์ง€, js, css ํŒŒ์ผ์ด ๋กœ๋”ฉ๋˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ. ๐Ÿ“Œํ•ด๊ฒฐ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ์„ค์ •์ด ์—†์œผ๋ฉด ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ๊ถŒํ•œ์„ ์š”๊ตฌํ•˜๋ฏ€๋กœ ์ •์  ๋ฆฌ์†Œ์Šค ๋˜ํ•œ 403(Access Denied) ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์ •์  ๋ฆฌ์†Œ์Šค์— ๊ถŒํ•œ์„ ์š”๊ตฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ `resource` ํด๋” ๋‚ด `/static` ์ดํ•˜์˜ ๋ชจ๋“  ํŒŒ์ผ์— ๋Œ€ํ•ด ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ด์ค€๋‹ค.   @Bean..

Java/Spring 2024.03.28

[SpringBoot] Spring Security: permitAll()์ด ๋™์ž‘ํ•˜์ง€ ์•Š์Œ

๐Ÿ“Œํ™˜๊ฒฝ IntelliJ Ultimate Java 17 Spring boot 3.2.3 Gradle - Groovy Dependencies: Spring Web Thymeleaf Spring Data JPA lombok MariaDB 10.11 Spring Dev tool Spring Security ๐Ÿ“Œ๋ฌธ์ œ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋ฅผ ์˜๋ฏธํ•˜๋Š” `/member`๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  url์— ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ •์  ๋ฆฌ์†Œ์Šค์™€ ์ž‘์„ฑ๋œ ๋‹ค๋ฅธ url์˜ ์š”์ฒญ์„ ๋ชจ๋‘ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ๋‹ค. http.csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(request -> request.requestMatchers(HttpMethod.POST, "/another..

Java/Spring 2024.03.27

[SpringBoot] ํŽ˜์ด์ง€๋„ค์ด์…˜(Pagination)

๐Ÿ“Œํ™˜๊ฒฝ IntelliJ Ultimate Java 17 SpringBoot 3.2.3 Gradle - Groovy Dependencies: Spring Web Thymeleaf Spring Data JPA lombok MariaDB 10.11 Spring Dev tool QueryDSL 5.0.0 ๐Ÿ“ŒํŽ˜์ด์ง€๋„ค์ด์…˜(Pagination)์ด๋ž€? ํŽ˜์ด์ง• ๋˜๋Š” ํŽ˜์ด์ง€๋„ค์ด์…˜์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณตํ†ต๋œ ๊ฐœ์ˆ˜๋งŒํผ ์—ฌ๋Ÿฌ ๋ฌถ์Œ์œผ๋กœ ๋‚˜๋ˆ„์–ด ํŠน์ • ํŽ˜์ด์ง€ ๋‹น ํ•œ ๋ฌถ์Œ์„ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. DB์— ๋“ฑ๋ก๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ์š”์ฒญ ์‹œ ์ „์ฒด๋ฅผ ํ•œ๋ฒˆ์— ๋“ค๊ณ ์˜จ๋‹ค๋ฉด ์‘๋‹ต ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ฒŒ ๋˜๋ฉด์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ถˆํŽธ์„ ์ดˆ๋ž˜ํ•œ๋‹ค. ์ด๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์ด์ง€์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ์ˆ˜๋งŒํผ ์ผ๋ถ€๋งŒ ์ž˜๋ผ์„œ ๊ฐ€์ ธ์˜จ๋‹ค๋ฉด ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ..

Java/Spring 2024.03.26

[Spring] ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•œ ํšŸ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œํ™˜๊ฒฝ IntelliJ Ultimate Java 17 SpringBoot 3.2.3 ๐Ÿ“Œ๋ฌธ์ œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋กœ ํšŒ์› ๋กœ๊ทธ์ธ ๋ฐ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ์„ค์ •ํ•˜๋˜ ๋„์ค‘ ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•จ. ์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋ฐœ์ƒํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ธ€์„ ์ž‘์„ฑํ•œ๋‹ค. 1. `/`๋Š” ๋ฉ”์ธ ์ธ๋ฑ์Šค๋กœ ๋ชจ๋“  ์œ ์ €๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , `/member/**`๋Š” `MEMBER` ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. 2. `/member`์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ `MEMBER` ๊ถŒํ•œ์ด ์—†์œผ๋ฉด `/member/login`์œผ๋กœ ํŠ•๊ฒจ๋‚˜๊ฐ€์•ผ ํ•œ๋‹ค. ์ด๋•Œ ๋กœ๊ทธ์ธ ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€ `/member`๋กœ ์ ‘๊ทผํ•  ๊ฒฝ์šฐ `/member/login`์œผ๋กœ ๊ฐ€์ง€ ์•Š๊ณ  ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๐Ÿ“Œํ•ด๊ฒฐ ๊ฒฐ๋ก ๋ถ€..

Java/Spring 2024.03.24

[Spring] ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ(Spring Security)

๐Ÿ“Œํ™˜๊ฒฝ IntelliJ Ultimate Java 17 SpringBoot 3.2.3 ๐Ÿ“Œ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ(Spring Security)๋ž€? ์ธ์ฆ(Autentication)๊ณผ ์ธ๊ฐ€(Autorization), ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” Spring์˜ ํ”„๋ ˆ์ž„์›Œํฌ. ์•ฝ๊ฐ„์˜ ์ฝ”๋“œ์™€ ์„ค์ •๋งŒ์œผ๋กœ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ์™€ ์ž๋™ ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์ธ ํ›„์ฒ˜๋ฆฌ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณด์•ˆ์— ๊ด€ํ•œ ๊ธฐ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. โœ”๏ธ ์ธ์ฆ(Autentication): ์Šค์Šค๋กœ๋ฅผ ์ฆ๋ช…ํ•จ. ์ฐธ์ด๋ผ๋Š” ๊ทผ๊ฑฐ๊ฐ€ ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ํ™•์ฆํ•˜๋Š” ํ–‰์œ„. ์‚ฌ์šฉ์ž๊ฐ€ ์Šค์Šค๋กœ๋ฅผ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์ž์‹ ์˜ ์ •๋ณด(์•„์ด๋”” ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์ธ์ฆ์„ ์™„๋ฃŒํ•˜๋Š” ๋กœ๊ทธ์ธ ๊ฐœ๋…์ด ์—ฌ๊ธฐ์— ์†ํ•œ๋‹ค. โœ”๏ธ ์ธ๊ฐ€(Au..

Java/Spring 2024.03.21

[JavaScript] ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„ ๋ฒ„ํŠผ ํ•œ๋ฒˆ์— eventListener ์„ค์ •ํ•˜๊ธฐ

const buttons = document.querySelectAll(".customBtn"); buttons.forEach(function (customBtn) { customBtn.addEventListener("click", function() {// ์—ฌ๊ธฐ์— ํด๋ฆญ ์‹œ ์ด๋ฒคํŠธ ๊ตฌํ˜„ } }}  `querySelectAll()`๋กœ ๋ชจ๋“  ๋ฒ„ํŠผ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋ฒ„ํŠผ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค.`forEach()` ํ•จ์ˆ˜ ๋‚ด์—์„œ `addEventListener()`๋ฅผ ์ ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.  ๐Ÿ“Œ์‘์šฉ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค.๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค.  ์ด๋ ‡๊ฒŒ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„ ๋ฒ„ํŠผ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•  ๋•Œ ๋ชจ๋‘ ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.  con..

JavaScript 2024.03.21

[SpringBoot] Spring Security ์‚ฌ์šฉ ์‹œ deprecated

๐Ÿ“Œํ™˜๊ฒฝ IntelliJ Ultimate Java 17 Spring boot 3.2.3 Gradle - Groovy Dependencies: Spring Web Thymeleaf Spring Data JPA lombok MariaDB 10.11 Spring Dev tool ๐Ÿ“Œ๋ฌธ์ œ 2024๋…„ 3์›” 16์ผ ๊ธฐ์ค€ ์Šคํ”„๋ง ๋ถ€ํŠธ 3.2.3๋ฒ„์ „ ํ”„๋กœ์ ํŠธ์—์„œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ ์ ์šฉ ๊ณผ์ • ๋„์ค‘ ์ฑ…๊ณผ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ์ฐธ๊ณ ํ•œ ์ฝ”๋“œ๊ฐ€ deprecated ๋˜์—ˆ๋‹ค๋Š” ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์ž‘์„ฑ๋˜์ง€ ์•Š๋Š” ๋ถˆํŽธ์„ ๊ฒช์–ด ํ•ด๋‹น ๊ธ€์„ ์ž‘์„ฑํ•œ๋‹ค. ๐Ÿ“Œํ•ด๊ฒฐ Spring Security 5.2 ์ดํ›„๋กœ `Configuration` ์ž‘์„ฑ ์‹œ ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ ๋Œ€์‹  ๋žŒ๋‹ค์‹์„ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ๋‹ค. Spring Security 6.0 ๋ฒ„์ „ ์ดํ›„๋กœ๋Š” ๊ธฐ์กด์˜ `WebSecuri..

Java/Spring 2024.03.16

_(underscore)๋กœ ์—ฐ๊ฒฐ๋œ uuid์™€ ์›๋ณธ ํŒŒ์ผ๋ช… ์ž˜๋ผ์„œ ๋ณด๊ด€ํ•˜๊ธฐ

๐Ÿ“Œํ™˜๊ฒฝ IntelliJ Ultimate Java 17 Spring boot 3.2.3 Gradle - Groovy Dependencies: Spring Web Thymeleaf Spring Data JPA lombok MariaDB 10.11 Spring Dev tool ๐Ÿ“Œ๋ฌธ์ œ ๊ฒŒ์‹œ๊ธ€ DTO์ธ `BoardDTO`๋ฅผ DB์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์—”ํ‹ฐํ‹ฐ์ธ `Board`์™€ `BoardImage`๋กœ ๋ณ€ํ™˜ํ•˜๊ณ ์ž ํ•œ๋‹ค. `BoardDTO`๋Š” ํŒŒ์ผ ์ด๋ฆ„ `String`์ด ๋‹ด๊ธด `List`๋ฅผ ํ•„๋“œ๋กœ ๊ฐ€์ง„๋‹ค. `BoardImage`๋Š” ๊ฐ๊ฐ uuid, ์›๋ณธ ํŒŒ์ผ๋ช…, ์ˆœ์„œ์ธ `uuid`, `fileName`, `ord`๋ฅผ ํ•„๋“œ๋กœ ๊ฐ€์ง€๋ฉฐ ์ƒ์œ„ ์—”ํ‹ฐํ‹ฐ์ธ `Board`๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋œ ๊ธ€ ์ž‘์„ฑ ์‹œ `BoardDTO`๋ฅผ ํŒŒ๋ผ..

Java/Spring 2024.03.16

[SpringBoot] Swagger UI์—์„œ MultipartFile ์„ค์ •์ด ๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜

๐Ÿ“Œํ™˜๊ฒฝ IntelliJ Ultimate Java 17 Spring boot 3.2.3 Gradle - Groovy Dependencies: Spring Web Thymeleaf Spring Data JPA lombok MariaDB 10.11 Spring Dev tool ๐Ÿ“Œ๋ฌธ์ œ ํŒŒ์ผ ์—…๋กœ๋“œ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ๋„ํ•˜๋Š” ๋„์ค‘ `Controller`์—์„œ ํƒ€์ž…์„ MultipartFile๋กœ ์ง€์ •ํ–ˆ์Œ์—๋„ swagger UI์—์„œapplication/json; charset=UTF-8๋กœ ์„ค์ •๋˜๋Š” ๋ฌธ์ œ. package org.zerock.b02.dto; import lombok.Data; import org.springframework.web.multipart.MultipartFile; import java.util.List; @..

Java/Spring 2024.03.15

[SpringBoot/JPA] deleteById์— ์ž˜๋ชป๋œ ๊ฐ’์„ ๋„ฃ์–ด๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ

๐Ÿ“Œํ™˜๊ฒฝ IntelliJ Ultimate Java 17 Spring boot 3.2.3 Gradle - Groovy Dependencies: Spring Web Thymeleaf Spring Data JPA lombok MariaDB 10.11 Spring Dev tool ๐Ÿ“Œ๋ฌธ์ œ `Reply`๋ฅผ ์‚ญ์ œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•˜์—ฌ /URI/{rno}์— `DELETE` ๋ฐฉ์‹์œผ๋กœ ์‚ญ์ œ๋ฅผ ์š”์ฒญํ•จ. `Reply`์˜ ์•„์ด๋””์ธ `rno`๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜๋Š” ์•„์ด๋””๋กœ ์„ค์ •ํ•  ๊ฒฝ์šฐ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—†๋Š” ๋ฒˆํ˜ธ๋กœ ์„ค์ •ํ•˜๊ณ  ์š”์ฒญํ•˜๋ฉด Exception ์—†์ด code 200์„ ๋ฐ˜ํ™˜ ๋ฐ›์•˜์Œ. ๊ธฐ๋Œ€ํ–ˆ๋˜ Exception : `EmptyResultDataAccessException` 500 ๊ฒฐ๊ณผ: 200 Hibernat..

Java/Spring 2024.03.14

[Spring] Mac M1 ์Šคํ”„๋ง๋ถ€ํŠธ ์‹คํ–‰ ์‹œ Port 8080 is already in use

ํ”„๋กœ์ ํŠธ๋ฅผ ์ด๊ฒƒ ์ €๊ฒƒ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ป๋‹ค๊ฐ€ ์ผฐ๋Š”๋ฐ ํฌํŠธ๊ฐ€ ๋‹ซํ˜€์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ 8080 ํฌํŠธ๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ๋ฐ ํ•ด๋‹น ํฌํŠธ๋กœ ์„œ๋ฒ„๋ฅผ ์˜ฌ๋ฆฌ๋ ค๊ณ  ์‹œ๋„ํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋‹ค. ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ์‹คํ–‰ ์ค‘์ธ ํฌํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค. sudo lsof -PiTCP -sTCP:LISTEN 8080์„ ์ฃฝ์—ฌ๋ฒ„๋ฆฐ๋‹ค. PID๋กœ ํ•ด๋‹น ํฌํŠธ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ๋‹ค. 88579 ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ ์น˜์ง€ ๋ง๊ณ  PID ์ณ๋ผ kill -9 88579 ์ฃฝ์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. sudo lsof -PiTCP -sTCP:LISTEN

Java/Spring 2024.03.13